mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
Compare commits
685 Commits
omega-mast
...
upsilon-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b9b49e0c17 | ||
|
|
bcef91bb59 | ||
|
|
ff068ca797 | ||
|
|
9d8e78ca1e | ||
|
|
90efabb404 | ||
|
|
26ee665d50 | ||
|
|
2233ca341b | ||
|
|
677528dfb6 | ||
|
|
bd78483d82 | ||
|
|
2b5d6e9d7f | ||
|
|
9bf61ded07 | ||
|
|
e3938e355b | ||
|
|
076fa3ab81 | ||
|
|
be0edc48b6 | ||
|
|
d1b8cefcf9 | ||
|
|
81ced8662c | ||
|
|
c1f5b4afac | ||
|
|
18f979dffe | ||
|
|
3c1bf54f0b | ||
|
|
5eb8054cde | ||
|
|
f0f67b2766 | ||
|
|
c403aeaa04 | ||
|
|
0a119fbad1 | ||
|
|
be688a487d | ||
|
|
84fe92e3d7 | ||
|
|
96077fcfb6 | ||
|
|
3566d44df2 | ||
|
|
13902cae72 | ||
|
|
59db12e78e | ||
|
|
696747a9a0 | ||
|
|
7093f706ff | ||
|
|
cc4b008048 | ||
|
|
1b9b53a201 | ||
|
|
a1f598194c | ||
|
|
768bd52d46 | ||
|
|
818e4d281f | ||
|
|
f380c927f7 | ||
|
|
0fc06fafaf | ||
|
|
7a9a8ba371 | ||
|
|
e6f14741d6 | ||
|
|
6a83882826 | ||
|
|
34506d334c | ||
|
|
ee8d456f1e | ||
|
|
e971681dfd | ||
|
|
276e8a603a | ||
|
|
c1cc19d47c | ||
|
|
7f560f8a5b | ||
|
|
f7cd1693c9 | ||
|
|
e6a308891b | ||
|
|
0c3506d85d | ||
|
|
d6831e46bf | ||
|
|
b6d5bda120 | ||
|
|
4c26e846d3 | ||
|
|
219c6c4046 | ||
|
|
ea1e0c8140 | ||
|
|
7f5fc1269d | ||
|
|
deda7483e3 | ||
|
|
520b88e364 | ||
|
|
172f168bb2 | ||
|
|
89def884f7 | ||
|
|
d3513a0763 | ||
|
|
ff54918502 | ||
|
|
3b22656d4f | ||
|
|
16d1946934 | ||
|
|
ac71576acc | ||
|
|
891693abe2 | ||
|
|
cf3cec7442 | ||
|
|
e20b1dee07 | ||
|
|
8ff2e021ec | ||
|
|
43a96629a4 | ||
|
|
6748f12239 | ||
|
|
5e83c03f8d | ||
|
|
510143678f | ||
|
|
35799f9a0d | ||
|
|
46f7eb5afe | ||
|
|
2671b6e0e1 | ||
|
|
64b4012f90 | ||
|
|
2374fe4cf8 | ||
|
|
1953371266 | ||
|
|
b667509ab4 | ||
|
|
cb6fd76141 | ||
|
|
f7a298aa0b | ||
|
|
5b87721f6e | ||
|
|
d51c55fc6c | ||
|
|
52bc616cd2 | ||
|
|
458c9316f1 | ||
|
|
9ac62c0496 | ||
|
|
7f2ba08761 | ||
|
|
a5354f589a | ||
|
|
2bf46f59ce | ||
|
|
0f2ce293d1 | ||
|
|
764ff6fd86 | ||
|
|
a0583aa2a9 | ||
|
|
0cabec542d | ||
|
|
ab854e16ab | ||
|
|
fd159fe489 | ||
|
|
f89ffc9b00 | ||
|
|
51d5ed04d0 | ||
|
|
a945fc1025 | ||
|
|
6976e524ad | ||
|
|
4630052630 | ||
|
|
3c6641c808 | ||
|
|
45a9dda989 | ||
|
|
73450419bb | ||
|
|
a124ed72b5 | ||
|
|
b44a95a9b3 | ||
|
|
aadcd37f31 | ||
|
|
0916996121 | ||
|
|
b4820d52e4 | ||
|
|
a87a99af7a | ||
|
|
83d6d33edf | ||
|
|
1067216d4f | ||
|
|
c0d998017d | ||
|
|
a729ef2a4c | ||
|
|
b43d773051 | ||
|
|
4acc79f1c7 | ||
|
|
58a373e683 | ||
|
|
8041c7a9d0 | ||
|
|
c5960430a3 | ||
|
|
12d8eeeb2c | ||
|
|
224cec5efc | ||
|
|
7af7b895f5 | ||
|
|
0e65c97774 | ||
|
|
72d10f8396 | ||
|
|
7030c58c51 | ||
|
|
1a681c7c75 | ||
|
|
ed002ed14b | ||
|
|
2312147957 | ||
|
|
d7f54ad644 | ||
|
|
1de090cea4 | ||
|
|
81dc1bd806 | ||
|
|
fc95028b57 | ||
|
|
c9c868c32c | ||
|
|
8d6c7d1bff | ||
|
|
42d8fea8c6 | ||
|
|
2a89c23e07 | ||
|
|
62d4d59d6b | ||
|
|
1bf164e1e3 | ||
|
|
851ec2ab69 | ||
|
|
08eb1aec99 | ||
|
|
78b606e825 | ||
|
|
ea89bc9aa5 | ||
|
|
56ce3b0f42 | ||
|
|
57e4cbe402 | ||
|
|
dfb5b90e55 | ||
|
|
1d00d7d9d3 | ||
|
|
3a220c0507 | ||
|
|
1fbd5281a9 | ||
|
|
51a5f699c3 | ||
|
|
77167d1706 | ||
|
|
a1e213ac91 | ||
|
|
d87c67d35b | ||
|
|
99b070a30d | ||
|
|
2a234305f3 | ||
|
|
992fb5dc85 | ||
|
|
891afff4bb | ||
|
|
92c653f2f2 | ||
|
|
25d4793441 | ||
|
|
4893b73917 | ||
|
|
0b2a581177 | ||
|
|
391fd5e243 | ||
|
|
ba43135fcb | ||
|
|
4d5b37fab1 | ||
|
|
e8ea693e5c | ||
|
|
125e1a8a82 | ||
|
|
7dff05287d | ||
|
|
25cd0d44f3 | ||
|
|
0751c88a2d | ||
|
|
d983797ac8 | ||
|
|
1319ad2f42 | ||
|
|
741a71554d | ||
|
|
9588052d68 | ||
|
|
35017ec167 | ||
|
|
3b12f29815 | ||
|
|
1f91a5f900 | ||
|
|
c826e556a1 | ||
|
|
1db74c78ab | ||
|
|
71a8c20ee7 | ||
|
|
d8423fb4f1 | ||
|
|
5444bdae99 | ||
|
|
952a83400a | ||
|
|
8996f960dc | ||
|
|
e4718fcb95 | ||
|
|
19de87f9b5 | ||
|
|
5f51ed0628 | ||
|
|
e4f0762db3 | ||
|
|
cbec2e5883 | ||
|
|
1e0fa89efe | ||
|
|
363ffbcaf8 | ||
|
|
48587c15d7 | ||
|
|
3eaa116ec6 | ||
|
|
ab8b353c9c | ||
|
|
8e543f30c9 | ||
|
|
833bc4a120 | ||
|
|
a01f4bcf1a | ||
|
|
3e42d4847a | ||
|
|
2a6d110f2f | ||
|
|
2ee7b67af1 | ||
|
|
be3c8fce9c | ||
|
|
ec36325799 | ||
|
|
36fa4a4152 | ||
|
|
6758a95292 | ||
|
|
5be8d6a1f5 | ||
|
|
5220dda095 | ||
|
|
7c51b1e55d | ||
|
|
7a2ee2bc56 | ||
|
|
9f6d52d9d5 | ||
|
|
efb32c9612 | ||
|
|
caf23dcbab | ||
|
|
6a894997fc | ||
|
|
f348d9eb5d | ||
|
|
0e0dc4a9c2 | ||
|
|
2be1a6e5a9 | ||
|
|
adab2c223b | ||
|
|
745099842a | ||
|
|
39f33347f9 | ||
|
|
03ae762b4a | ||
|
|
5b7bdc1ec1 | ||
|
|
7d61e236df | ||
|
|
7f8e6a6b87 | ||
|
|
9c69379096 | ||
|
|
aff5803ef3 | ||
|
|
fd7bdc7345 | ||
|
|
807945ad0f | ||
|
|
35f09ed389 | ||
|
|
c73b13bd41 | ||
|
|
47558446c4 | ||
|
|
45b4dd337c | ||
|
|
0332f43c5c | ||
|
|
667bac136b | ||
|
|
b15d49511d | ||
|
|
04ae526a39 | ||
|
|
0e49d23faa | ||
|
|
595c69bfcf | ||
|
|
18ff283580 | ||
|
|
42368ecd6e | ||
|
|
27cf6a0615 | ||
|
|
5ed8aef907 | ||
|
|
3c53421ffa | ||
|
|
d10d1cd65d | ||
|
|
cec75bfaed | ||
|
|
77352e34b5 | ||
|
|
38796253cb | ||
|
|
4b7631e78a | ||
|
|
c54a97a03d | ||
|
|
d42e4269a9 | ||
|
|
2bf6de5044 | ||
|
|
22ba190542 | ||
|
|
0e24823511 | ||
|
|
f174fbc3f5 | ||
|
|
4ca7d9208c | ||
|
|
2bfc243e5a | ||
|
|
add333b920 | ||
|
|
eeff886cc1 | ||
|
|
ff307b8df8 | ||
|
|
21f08a2d06 | ||
|
|
c837709801 | ||
|
|
a0caf67d7c | ||
|
|
f4e84bc208 | ||
|
|
225b942989 | ||
|
|
3b955c2eb6 | ||
|
|
0e46954f80 | ||
|
|
bf1d570623 | ||
|
|
5f50f3fc9c | ||
|
|
4a830a0f30 | ||
|
|
01c3f767e4 | ||
|
|
3c098b684b | ||
|
|
e886863230 | ||
|
|
7ce3aac2f6 | ||
|
|
3c26035feb | ||
|
|
ff40b8b862 | ||
|
|
62e98107f7 | ||
|
|
7a6c211001 | ||
|
|
80f099c274 | ||
|
|
d3754a931a | ||
|
|
3af3d70055 | ||
|
|
8db051474c | ||
|
|
3328bc28b9 | ||
|
|
c65b1c6d3c | ||
|
|
15801ae9e4 | ||
|
|
3dfc8d749c | ||
|
|
9f7aba4593 | ||
|
|
5365718761 | ||
|
|
c0c1615f14 | ||
|
|
a770ee919b | ||
|
|
7e64124ddc | ||
|
|
e2598031c8 | ||
|
|
2ebc1bc22f | ||
|
|
202c273c67 | ||
|
|
45229b80cd | ||
|
|
b675a78a87 | ||
|
|
15f0833f3b | ||
|
|
e40d63a6ff | ||
|
|
323eba63e1 | ||
|
|
3b293c822a | ||
|
|
8ac969d772 | ||
|
|
865bacf89a | ||
|
|
841ac7d5f4 | ||
|
|
c92c4d8383 | ||
|
|
97a168052b | ||
|
|
42343d562c | ||
|
|
3740a93a9f | ||
|
|
6dc31401fe | ||
|
|
8c3378a723 | ||
|
|
126bdd68bb | ||
|
|
f1c24db90a | ||
|
|
fd4a2205f3 | ||
|
|
fc252672cc | ||
|
|
1c918f549c | ||
|
|
72a25ec26d | ||
|
|
bdfae184e9 | ||
|
|
23936a0c63 | ||
|
|
209428ca9d | ||
|
|
370eb14a04 | ||
|
|
bf8f8bcb27 | ||
|
|
fc3941511f | ||
|
|
9fda743de9 | ||
|
|
74ef528845 | ||
|
|
7a2721c979 | ||
|
|
227ca616ca | ||
|
|
1c04949336 | ||
|
|
93099ad808 | ||
|
|
88b4e904c0 | ||
|
|
dee783065b | ||
|
|
5a7b076ebe | ||
|
|
85ef57f7ed | ||
|
|
63c2b99260 | ||
|
|
377f4eee0c | ||
|
|
a63cbcf0c2 | ||
|
|
f2c17121d2 | ||
|
|
d16808183b | ||
|
|
6eabe9acae | ||
|
|
e1dcbad18a | ||
|
|
4fe84a4959 | ||
|
|
272797f31f | ||
|
|
c635f4e2b9 | ||
|
|
c8ba2fd268 | ||
|
|
3a391261c7 | ||
|
|
2da1610b27 | ||
|
|
5e130cc4f2 | ||
|
|
2b5a773993 | ||
|
|
19e5562228 | ||
|
|
9edf026110 | ||
|
|
ffb4c39e04 | ||
|
|
61673cd1b5 | ||
|
|
f95f9ebb2d | ||
|
|
23af100ed5 | ||
|
|
c7516f1464 | ||
|
|
23a94b7f50 | ||
|
|
af5f9ea578 | ||
|
|
f3d632c462 | ||
|
|
893a2a550d | ||
|
|
2443fa7d57 | ||
|
|
4f0f41be56 | ||
|
|
5eb0598107 | ||
|
|
43b56f3a89 | ||
|
|
034fc65bc2 | ||
|
|
9ab3e6c715 | ||
|
|
d8f93709b8 | ||
|
|
708070c284 | ||
|
|
9632b59b67 | ||
|
|
a0afbe9916 | ||
|
|
100917f29f | ||
|
|
814e2dee06 | ||
|
|
1a546e011b | ||
|
|
1faac23ee8 | ||
|
|
38614a849f | ||
|
|
24205a7e03 | ||
|
|
f4ce415e32 | ||
|
|
169fb7404e | ||
|
|
e575ffc7ce | ||
|
|
f591816122 | ||
|
|
cbbe7ef6ac | ||
|
|
f862cb023a | ||
|
|
f296778014 | ||
|
|
16eaab3b52 | ||
|
|
77707cd930 | ||
|
|
a3e2c9732f | ||
|
|
98c919db88 | ||
|
|
8126e0da7e | ||
|
|
685e73c52d | ||
|
|
64a90422c4 | ||
|
|
fea588bd9d | ||
|
|
9595ed1570 | ||
|
|
4f63100195 | ||
|
|
ed06b4e48b | ||
|
|
d5dbb8df6f | ||
|
|
fdef2b5d6e | ||
|
|
7fc28f8b72 | ||
|
|
2248e415c4 | ||
|
|
1da537479f | ||
|
|
0860e48cb6 | ||
|
|
70b162e63b | ||
|
|
398e974ccd | ||
|
|
d57e19ae70 | ||
|
|
87a5dc354d | ||
|
|
cd3f5225bb | ||
|
|
139ef4a052 | ||
|
|
66afb977db | ||
|
|
cb9dc38fa9 | ||
|
|
67e42aaac3 | ||
|
|
f1be48bdb1 | ||
|
|
ed5cff15c6 | ||
|
|
963647d59f | ||
|
|
a14f2015cf | ||
|
|
dbbf27e59b | ||
|
|
65b3a2857f | ||
|
|
dd48235721 | ||
|
|
46041e8e9a | ||
|
|
38faecda29 | ||
|
|
0bd30ed2e6 | ||
|
|
5cbce3c116 | ||
|
|
665de51bae | ||
|
|
47e3036afd | ||
|
|
1df3ef87e6 | ||
|
|
4222137549 | ||
|
|
806b11b589 | ||
|
|
fb4b2ffdfa | ||
|
|
d2ec87d9fd | ||
|
|
6b12d1aebf | ||
|
|
9afb42716d | ||
|
|
2d4c0f18d0 | ||
|
|
918c9249db | ||
|
|
cf33f84106 | ||
|
|
df7b97bb87 | ||
|
|
e8a1bc6149 | ||
|
|
b304a2ff7d | ||
|
|
50ee8021f3 | ||
|
|
ed7e0bd915 | ||
|
|
84d88a3e8d | ||
|
|
00b5d4b9fe | ||
|
|
2aee07ae55 | ||
|
|
41b2b64d80 | ||
|
|
473b0bbfcb | ||
|
|
58ef8cb95d | ||
|
|
5dce215165 | ||
|
|
f2f44f0f6f | ||
|
|
fbe542e5bf | ||
|
|
0a1b3bcaee | ||
|
|
f6e937a927 | ||
|
|
c4ed8f84d3 | ||
|
|
8e1b311be0 | ||
|
|
89e51166e7 | ||
|
|
e4961563e9 | ||
|
|
e72b0f633e | ||
|
|
0550b66c03 | ||
|
|
e41910e2f8 | ||
|
|
d91ae29607 | ||
|
|
3b90969b42 | ||
|
|
bd207cb845 | ||
|
|
917ba7ce83 | ||
|
|
9c9758fcb6 | ||
|
|
83ce9d5e86 | ||
|
|
d4f0c7d3e8 | ||
|
|
2837b240e9 | ||
|
|
0906dc919b | ||
|
|
9cda9d9e59 | ||
|
|
553f3fc682 | ||
|
|
9fdedecbff | ||
|
|
83c63a7011 | ||
|
|
9636964cb9 | ||
|
|
69d6ad5205 | ||
|
|
f9a123cc08 | ||
|
|
56f735e302 | ||
|
|
0a5e9e0889 | ||
|
|
8c949d7048 | ||
|
|
2f7edc5024 | ||
|
|
cd40938b26 | ||
|
|
0b54bf13f4 | ||
|
|
f5f11c6478 | ||
|
|
efda561425 | ||
|
|
15c96cefa6 | ||
|
|
400d03ebdb | ||
|
|
6f48adde7d | ||
|
|
3a573b1204 | ||
|
|
48598296cf | ||
|
|
a54d60644f | ||
|
|
d579e9d14c | ||
|
|
db0ae2f7a0 | ||
|
|
2a66fbb75d | ||
|
|
feb94af827 | ||
|
|
0b564510e7 | ||
|
|
05227184a1 | ||
|
|
e551c69d06 | ||
|
|
37c7b85da8 | ||
|
|
0bed38576a | ||
|
|
7c02c9e72f | ||
|
|
a5584634e5 | ||
|
|
62e5b3e135 | ||
|
|
62f43f393d | ||
|
|
3318780d7d | ||
|
|
a9fc3b7850 | ||
|
|
959efdc995 | ||
|
|
fa278b0d78 | ||
|
|
e8044f938e | ||
|
|
02f4f6fe74 | ||
|
|
fe973b0535 | ||
|
|
71a764277f | ||
|
|
f6379d16fd | ||
|
|
2156ca7e42 | ||
|
|
2f3339dff7 | ||
|
|
48a0da8a95 | ||
|
|
3460e9ffd8 | ||
|
|
1487acbe38 | ||
|
|
367f64dac8 | ||
|
|
19ee32986f | ||
|
|
7f0b8170d4 | ||
|
|
bba7408e6c | ||
|
|
838ee83a8c | ||
|
|
74c500df01 | ||
|
|
98b665ac4b | ||
|
|
0f4502ebce | ||
|
|
9eb81a6daf | ||
|
|
a15c682e3e | ||
|
|
74635f8d88 | ||
|
|
ebe6a7cc5f | ||
|
|
3a4e33a1a7 | ||
|
|
dd757969f3 | ||
|
|
0df76f1680 | ||
|
|
788e75eb4a | ||
|
|
7b4a94296b | ||
|
|
86511cc59d | ||
|
|
d90af0323e | ||
|
|
c0739b0e06 | ||
|
|
210a83b04d | ||
|
|
fb4fc4862d | ||
|
|
74c6bea8f8 | ||
|
|
7c1dc4d5c3 | ||
|
|
eb02fb5baa | ||
|
|
6fcab3952f | ||
|
|
5a6dfd8a20 | ||
|
|
c8afdcacab | ||
|
|
ef45fab63d | ||
|
|
0366c4cd00 | ||
|
|
dc8a1d48d9 | ||
|
|
649f48919e | ||
|
|
c3b752d6cc | ||
|
|
c5ca1e916a | ||
|
|
24f3ccf007 | ||
|
|
25b74ea2f8 | ||
|
|
0e7db3ce8a | ||
|
|
786a3273da | ||
|
|
ed54927c5b | ||
|
|
2ee86ce52f | ||
|
|
a3720d3d76 | ||
|
|
837fcd9bcc | ||
|
|
b0befbdbc5 | ||
|
|
cf9142b5a2 | ||
|
|
80587f35f1 | ||
|
|
ba94c7db00 | ||
|
|
4c29b05b53 | ||
|
|
85f8f4fedd | ||
|
|
e62c328661 | ||
|
|
080ac51aae | ||
|
|
bf5f24f96c | ||
|
|
7e24502414 | ||
|
|
dd45419006 | ||
|
|
aba2388253 | ||
|
|
5fca77a8f8 | ||
|
|
f258da16f1 | ||
|
|
35e4146551 | ||
|
|
76dad83aec | ||
|
|
f999c796c3 | ||
|
|
f86c22f10b | ||
|
|
c841362a63 | ||
|
|
33ad74e1be | ||
|
|
e4aa82e62a | ||
|
|
f40fe27b68 | ||
|
|
3e071a59fe | ||
|
|
f50f22081c | ||
|
|
313b5ed222 | ||
|
|
f8798aa561 | ||
|
|
46acd4eb61 | ||
|
|
018ea07796 | ||
|
|
d7f41e306c | ||
|
|
029dc2be5e | ||
|
|
bf99a2976b | ||
|
|
03c85c0b0e | ||
|
|
bd0c7de2bf | ||
|
|
08f351fe31 | ||
|
|
0282104086 | ||
|
|
ed95b46c5b | ||
|
|
b8727bc256 | ||
|
|
5ccf8d6b97 | ||
|
|
b80daf70d3 | ||
|
|
36655f1c19 | ||
|
|
ed18f1e95f | ||
|
|
cbb435d656 | ||
|
|
00b74430cd | ||
|
|
8705ddaf8a | ||
|
|
ddae6607f9 | ||
|
|
c4ef2016ba | ||
|
|
524a7d9619 | ||
|
|
e456667d5e | ||
|
|
3000431f3b | ||
|
|
50a32b470d | ||
|
|
3746354f26 | ||
|
|
8fae36bcd3 | ||
|
|
9e9c088e9e | ||
|
|
a635ecf59b | ||
|
|
a6ae1957d1 | ||
|
|
3686f819d6 | ||
|
|
382c303bd2 | ||
|
|
402858739e | ||
|
|
192794e299 | ||
|
|
58602544e2 | ||
|
|
ed03aae9ed | ||
|
|
ece6aa5f27 | ||
|
|
30cfa022d1 | ||
|
|
23f3407267 | ||
|
|
1006b951b9 | ||
|
|
43b7f767ee | ||
|
|
eb0ca7b118 | ||
|
|
0cdfc44c6f | ||
|
|
2ebff40c62 | ||
|
|
c66db8c98d | ||
|
|
a6b13185ab | ||
|
|
e8956f4293 | ||
|
|
36a40faaaf | ||
|
|
2554ec666e | ||
|
|
1aac2a1d4d | ||
|
|
32d591317b | ||
|
|
2703f9a506 | ||
|
|
497e4890b1 | ||
|
|
6c389c9a1d | ||
|
|
699cf22023 | ||
|
|
543d3d540e | ||
|
|
2f2e45a6a5 | ||
|
|
a834c954b8 | ||
|
|
2bee7eb267 | ||
|
|
6d18c33068 | ||
|
|
8242113641 | ||
|
|
7c8c7f79f6 | ||
|
|
f578c24af1 | ||
|
|
8059821025 | ||
|
|
b32497da23 | ||
|
|
c3c7651ca8 | ||
|
|
e8f1ea6aa5 | ||
|
|
ba3109e47a | ||
|
|
c2f8bbaf3c | ||
|
|
0587e41b3c | ||
|
|
ab1df4fbef | ||
|
|
a4213dcca8 | ||
|
|
2cf6f15dde | ||
|
|
f37008d8d7 | ||
|
|
3740e0f135 | ||
|
|
cb3a6694a5 | ||
|
|
cba596dde7 | ||
|
|
11f2b92e5d | ||
|
|
a69fc679a9 | ||
|
|
f4905c59a2 | ||
|
|
22b6990e63 | ||
|
|
09a7b9daca | ||
|
|
0116dc2e07 | ||
|
|
37b8c56b3d | ||
|
|
1a4cb3ad37 | ||
|
|
d4984722cf | ||
|
|
cbc3951ab1 | ||
|
|
62aafa7597 | ||
|
|
baf8b8cbf0 | ||
|
|
90b25ecf51 | ||
|
|
d02ce2dd16 | ||
|
|
79985a0199 | ||
|
|
f10cd19616 | ||
|
|
945a7b8d56 | ||
|
|
784234690c | ||
|
|
fd0284756f | ||
|
|
4f2ea99c85 | ||
|
|
bef8719ce0 | ||
|
|
ba64458660 | ||
|
|
73172f8d0c | ||
|
|
5a20d914df | ||
|
|
05e6fbbcca | ||
|
|
890592854a | ||
|
|
6c6f8b581c | ||
|
|
92ee632ce2 | ||
|
|
3e2b5178ed | ||
|
|
5b21c57e4c | ||
|
|
76beed20da | ||
|
|
86985a4aef | ||
|
|
aacd1a6f32 | ||
|
|
dd258a7975 | ||
|
|
b4e9ceed18 | ||
|
|
c37b4bd1f4 | ||
|
|
a0acdc171b |
8
.github/ISSUE_TEMPLATE/bug_report.md
vendored
8
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: Bug report
|
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: ''
|
title: ''
|
||||||
labels: 'Status: Triage, Type: Bug'
|
labels: 'Status: Triage, Type: Bug'
|
||||||
assignees: ''
|
assignees: ''
|
||||||
@@ -23,5 +23,7 @@ A clear and concise description of what you expected to happen.
|
|||||||
**Screenshots**
|
**Screenshots**
|
||||||
If applicable, add screenshots to help explain your problem.
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
**Desktop (please complete the following information):**
|
**Device (please complete the following information):**
|
||||||
- Omega Version: [go to settings > about > Omega Version and type the version here]
|
- The device on which you're running Upsilon (computer, n0110, n0100, etc...)
|
||||||
|
- Upsilon Version: [go to settings > about > Upsilon Version and type the version here]
|
||||||
|
- Upsilon commit: [settings > about > click one time on epsilon version]
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: Feature request
|
name: Feature request
|
||||||
about: Suggest an idea for Omega
|
about: Suggest an idea for Upsilon
|
||||||
title: ''
|
title: ''
|
||||||
labels: 'Status: Triage, Type: Feature'
|
labels: 'Status: Triage, Type: Feature'
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
name: OMEGA BETA ONLY - Bug report
|
|
||||||
about: Omega 1.21 is not working like it should? Let us know!
|
|
||||||
title: "[BETA-1.21] …"
|
|
||||||
labels: 'Status: Triage, Type: Bug'
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
**To Reproduce**
|
|
||||||
Steps to reproduce the behavior:
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. Scroll down to '....'
|
|
||||||
4. See error
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
**Screenshots**
|
|
||||||
If applicable, add screenshots to help explain your problem.
|
|
||||||
|
|
||||||
**Desktop (please complete the following information):**
|
|
||||||
- Omega Version: [go to settings > about > Omega Version and type the version here]
|
|
||||||
- Discord username: ..........#....
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: Problems during installation
|
name: Problems during installation
|
||||||
about: Need help to install Omega?
|
about: Need help to install Upsilon?
|
||||||
title: ''
|
title: ''
|
||||||
labels: 'Status: Triage, Type: Installation issue'
|
labels: 'Status: Triage, Type: Installation issue'
|
||||||
assignees: ''
|
assignees: ''
|
||||||
@@ -16,4 +16,4 @@ Copy/paste the logs here (If you have some)
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Environment**
|
**Environment**
|
||||||
- Omega Version: {go to settings > about > Omega Version and type the version here}
|
- Upsilon Version: {go to settings > about > Upsilon Version and type the version here}
|
||||||
|
|||||||
12
.github/workflows/ci-docker.yml
vendored
12
.github/workflows/ci-docker.yml
vendored
@@ -1,12 +0,0 @@
|
|||||||
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)
|
|
||||||
515
.github/workflows/ci-workflow.yml
vendored
515
.github/workflows/ci-workflow.yml
vendored
@@ -8,115 +8,359 @@ on:
|
|||||||
triggerIos:
|
triggerIos:
|
||||||
description: 'Run iOS tests'
|
description: 'Run iOS tests'
|
||||||
required: true
|
required: true
|
||||||
default: 'no'
|
default: 'yes'
|
||||||
triggerMacos:
|
triggerMacos:
|
||||||
description: 'Run macOS tests'
|
description: 'Run macOS tests'
|
||||||
required: true
|
required: true
|
||||||
default: 'no'
|
default: 'yes'
|
||||||
trigger3DS:
|
trigger3DS:
|
||||||
description: 'Run 3DS tests'
|
description: 'Run 3DS tests'
|
||||||
required: true
|
required: true
|
||||||
|
default: 'yes'
|
||||||
|
triggerFxcg:
|
||||||
|
description: 'Run fxcg tests'
|
||||||
|
required: true
|
||||||
default: 'no'
|
default: 'no'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
nintendo_3ds:
|
fxcg: # fxcg build is broken for now, disabling it for now to avoid noise
|
||||||
if: github.event.inputs.trigger3DS == 'yes'
|
if: github.event.inputs.triggerFxcg == 'yes'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- run: wget https://github.com/devkitPro/pacman/releases/download/v1.0.2/devkitpro-pacman.amd64.deb -O /tmp/devkitpro-pacman.deb
|
- uses: actions/checkout@v5
|
||||||
- run: yes | sudo dpkg -i /tmp/devkitpro-pacman.deb
|
with:
|
||||||
- run: yes | sudo dkp-pacman -Syu --needed devkitARM 3dstools libctru
|
submodules: 'recursive'
|
||||||
- run: echo ::set-env name=DEVKITPRO::/opt/devkitpro
|
- name: Install dependencies
|
||||||
- run: echo ::set-env name=DEVKITARM::/opt/devkitpro/devkitARM
|
run: |
|
||||||
- run: echo ::set-env name=PATH::$DEVKITPRO/tools/bin:$DEVKITARM/bin:$PATH
|
sudo apt-get update
|
||||||
|
sudo apt-get install build-essential cmake libfreetype-dev -y
|
||||||
- uses: actions/checkout@v1
|
- name: Get latest gint commit hash
|
||||||
|
run: |
|
||||||
|
LATEST_COMMIT_HASH=$(curl --silent https://git.planet-casio.com/api/v1/repos/Lephenixnoir/gint/branches/master | jq -r .commit.id)
|
||||||
|
echo "Latest commit hash is: $LATEST_COMMIT_HASH"
|
||||||
|
echo "LATEST_COMMIT_HASH=$LATEST_COMMIT_HASH" >> $GITHUB_OUTPUT
|
||||||
|
id: get-latest-commit-hash
|
||||||
|
- name: Cache gint/fxsdk installation
|
||||||
|
id: cache-gint
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.local/*/*
|
||||||
|
!~/.local/share/containers
|
||||||
|
key: ${{ runner.os }}-gint-${{ steps.get-latest-commit-hash.outputs.LATEST_COMMIT_HASH }}
|
||||||
|
- name: Install gint/fxsdk
|
||||||
|
if: steps.cache-gint.outputs.cache-hit != 'true'
|
||||||
|
env:
|
||||||
|
URL: "https://git.planet-casio.com/Lephenixnoir/GiteaPC/archive/master.tar.gz"
|
||||||
|
run: |
|
||||||
|
export PATH="~/.local/bin:$PATH"
|
||||||
|
cd "$(mktemp -d)"
|
||||||
|
curl "$URL" -o giteapc-master.tar.gz
|
||||||
|
tar -xzf giteapc-master.tar.gz
|
||||||
|
cd giteapc
|
||||||
|
python3 giteapc.py install Lephenixnoir/GiteaPC -y
|
||||||
|
sudo apt-get install python3-pil libusb-1.0-0-dev libudev-dev libsdl2-dev libpng-dev libudisks2-dev libglib2.0-dev libmpfr-dev libmpc-dev libppl-dev -y
|
||||||
|
giteapc install Lephenixnoir/fxsdk:noudisks2 Lephenixnoir/sh-elf-binutils Lephenixnoir/sh-elf-gcc -y
|
||||||
|
giteapc install Lephenixnoir/OpenLibm Vhex-Kernel-Core/fxlibc Lephenixnoir/sh-elf-gcc -y
|
||||||
|
giteapc install Lephenixnoir/gint -y
|
||||||
|
- name: Add fxsdk to PATH
|
||||||
|
run: echo "~/.local/bin" >> $GITHUB_PATH
|
||||||
|
- run: make -j2 PLATFORM=simulator TARGET=fxcg
|
||||||
|
- id: 'auth'
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: 'google-github-actions/auth@v0'
|
||||||
|
with:
|
||||||
|
credentials_json: '${{secrets.GOOGLE_CREDENTIALS}}'
|
||||||
|
- id: 'upload-directory'
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: 'google-github-actions/upload-cloud-storage@v0'
|
||||||
|
with:
|
||||||
|
path: 'output/release/simulator/fxcg/epsilon.g3a'
|
||||||
|
destination: 'upsilon-binfiles.appspot.com/dev/simulator/'
|
||||||
|
parent: false
|
||||||
|
- if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
repository: Yaya-Cout/Upsilon-binfiles
|
||||||
|
ref: 'main'
|
||||||
|
token: ${{ secrets.PAT_UPSILON_BINFILES }}
|
||||||
|
path: 'binfiles'
|
||||||
|
# TODO: Handle git conflicts using rebase
|
||||||
|
- name: Upload binary files to website
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
|
||||||
|
run: |
|
||||||
|
cp -r output/release/simulator/fxcg/epsilon.g3a binfiles/binaries/dev/simulator
|
||||||
|
cd binfiles
|
||||||
|
git add -A
|
||||||
|
git config --global user.email "ci@github.com"
|
||||||
|
git config --global user.name "GitHub Upsilon CI"
|
||||||
|
git pull
|
||||||
|
git commit -m "Update from CI"
|
||||||
|
git push
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: epsilon.g3a
|
||||||
|
path: output/release/simulator/fxcg/epsilon.g3a
|
||||||
|
nintendo_3ds:
|
||||||
|
if: github.event.inputs.trigger3DS == 'yes' || github.event.inputs.trigger3DS == ''
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: devkitpro/devkitarm:latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
|
- run: sudo apt-get update
|
||||||
|
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config -y
|
||||||
|
- run: yes | sudo dkp-pacman -S --needed devkitARM 3dstools libctru
|
||||||
|
- run: wget https://github.com/3DSGuy/Project_CTR/releases/download/makerom-v0.18.3/makerom-v0.18.3-ubuntu_x86_64.zip
|
||||||
|
- run: unzip makerom-v0.18.3-ubuntu_x86_64.zip
|
||||||
|
- run: rm makerom-v0.18.3-ubuntu_x86_64.zip
|
||||||
|
- run: chmod +x ./makerom
|
||||||
|
- run: echo "PATH=.:$PATH" >> $GITHUB_ENV
|
||||||
- run: make -j2 PLATFORM=simulator TARGET=3ds
|
- run: make -j2 PLATFORM=simulator TARGET=3ds
|
||||||
- run: make -j2 PLATFORM=simulator TARGET=3ds epsilon.cia
|
- run: make -j2 PLATFORM=simulator TARGET=3ds epsilon.cia
|
||||||
- uses: actions/upload-artifact@master
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: epsilon-3ds.3dsx
|
name: epsilon-3ds.3dsx
|
||||||
path: output/release/simulator/3ds/epsilon.3dsx
|
path: output/release/simulator/3ds/epsilon.3dsx
|
||||||
- uses: actions/upload-artifact@master
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: epsilon-3ds.cia
|
name: epsilon-3ds.cia
|
||||||
path: output/release/simulator/3ds/epsilon.cia
|
path: output/release/simulator/3ds/epsilon.cia
|
||||||
|
- if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
repository: Yaya-Cout/Upsilon-binfiles
|
||||||
|
ref: 'main'
|
||||||
|
token: ${{ secrets.PAT_UPSILON_BINFILES }}
|
||||||
|
path: 'binfiles'
|
||||||
|
# TODO: Handle git conflicts using rebase
|
||||||
|
- name: Upload binary files to website
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
|
||||||
|
run: |
|
||||||
|
cp -r output/release/simulator/3ds/epsilon.3dsx output/release/simulator/3ds/epsilon.cia binfiles/binaries/dev/simulator
|
||||||
|
cd binfiles
|
||||||
|
git add -A
|
||||||
|
git config --global user.email "ci@github.com"
|
||||||
|
git config --global user.name "GitHub Upsilon CI"
|
||||||
|
git pull
|
||||||
|
git commit -m "Update from CI"
|
||||||
|
git push
|
||||||
android:
|
android:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
- run: make -j2 PLATFORM=simulator TARGET=android
|
- run: |
|
||||||
- uses: actions/upload-artifact@master
|
sudo apt-get update
|
||||||
|
sudo apt-get install imagemagick libfreetype-dev libpng-dev
|
||||||
|
- name: Set up JDK 25
|
||||||
|
uses: actions/setup-java@v5
|
||||||
|
with:
|
||||||
|
java-version: '25'
|
||||||
|
distribution: 'temurin'
|
||||||
|
- run: wget -nv https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip
|
||||||
|
- run: unzip -q android-ndk-r21e-linux-x86_64.zip
|
||||||
|
- run: make -j2 PLATFORM=simulator TARGET=android NDK_PATH=./android-ndk-r21e
|
||||||
|
- id: 'auth'
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: 'google-github-actions/auth@v0'
|
||||||
|
with:
|
||||||
|
credentials_json: '${{secrets.GOOGLE_CREDENTIALS}}'
|
||||||
|
- id: 'upload-file'
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: 'google-github-actions/upload-cloud-storage@v0'
|
||||||
|
with:
|
||||||
|
path: 'output/release/simulator/android/epsilon.apk'
|
||||||
|
destination: 'upsilon-binfiles.appspot.com/dev/simulator/'
|
||||||
|
parent: false
|
||||||
|
- if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
repository: Yaya-Cout/Upsilon-binfiles
|
||||||
|
ref: 'main'
|
||||||
|
token: ${{ secrets.PAT_UPSILON_BINFILES }}
|
||||||
|
path: 'binfiles'
|
||||||
|
# TODO: Handle git conflicts using rebase
|
||||||
|
- name: Upload binary files to website
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
|
||||||
|
run: |
|
||||||
|
cp -r output/release/simulator/android/epsilon.apk binfiles/binaries/dev/simulator
|
||||||
|
cd binfiles
|
||||||
|
git add -A
|
||||||
|
git config --global user.email "ci@github.com"
|
||||||
|
git config --global user.name "GitHub Upsilon CI"
|
||||||
|
git pull
|
||||||
|
git commit -m "Update from CI"
|
||||||
|
git push
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: epsilon-android.apk
|
name: epsilon-android.apk
|
||||||
path: output/release/simulator/android/epsilon.apk
|
path: output/release/simulator/android/epsilon.apk
|
||||||
n0100:
|
n0100:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04-arm
|
||||||
steps:
|
steps:
|
||||||
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
|
- run: |
|
||||||
- uses: numworks/setup-arm-toolchain@2020-q2
|
sudo apt-get update
|
||||||
- uses: actions/checkout@v2
|
sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
|
||||||
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
- run: mkdir final-output
|
- run: mkdir final-output
|
||||||
- run: make -j2 MODEL=n0100 EPSILON_I18N=en output/release/device/n0100/epsilon.onboarding.two_binaries
|
- run: make -j2 MODEL=n0100 EPSILON_I18N=en output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.en.bin
|
- run: make -j2 MODEL=n0100 EPSILON_I18N=en output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
|
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.en.internal.bin
|
||||||
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
|
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
|
||||||
|
# We need to duplicate make to work around i18n generator race condition in Makefile leading to inconsistent incremental rebuilds
|
||||||
- run: make -j2 MODEL=n0100 EPSILON_I18N=fr output/release/device/n0100/epsilon.onboarding.two_binaries
|
- run: make -j2 MODEL=n0100 EPSILON_I18N=fr output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.fr.bin
|
- run: make -j2 MODEL=n0100 EPSILON_I18N=fr output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
|
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.fr.internal.bin
|
||||||
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
|
- run: 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: make -j2 MODEL=n0100 EPSILON_I18N=nl output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.nl.bin
|
- run: make -j2 MODEL=n0100 EPSILON_I18N=nl output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
|
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.nl.internal.bin
|
||||||
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
|
- run: 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: make -j2 MODEL=n0100 EPSILON_I18N=pt output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.pt.bin
|
- run: make -j2 MODEL=n0100 EPSILON_I18N=pt output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
|
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.pt.internal.bin
|
||||||
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
|
- run: 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: make -j2 MODEL=n0100 EPSILON_I18N=it output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.it.bin
|
- run: make -j2 MODEL=n0100 EPSILON_I18N=it output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
|
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.it.internal.bin
|
||||||
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
|
- run: 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: make -j2 MODEL=n0100 EPSILON_I18N=de output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.de.bin
|
- run: make -j2 MODEL=n0100 EPSILON_I18N=de output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
|
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.de.internal.bin
|
||||||
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
|
- run: 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: make -j2 MODEL=n0100 EPSILON_I18N=es output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.es.bin
|
- run: make -j2 MODEL=n0100 EPSILON_I18N=es output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
|
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.es.internal.bin
|
||||||
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
|
- run: 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: make -j2 MODEL=n0100 EPSILON_I18N=hu output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.hu.bin
|
- run: make -j2 MODEL=n0100 EPSILON_I18N=hu output/release/device/n0100/epsilon.onboarding.two_binaries
|
||||||
|
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.hu.internal.bin
|
||||||
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
|
- run: 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: 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: mv output/release/device/n0100/flasher.light.bin final-output/flasher.light.bin
|
||||||
|
- run: make -j2 MODEL=n0100 output/release/device/n0100/flasher.verbose.bin
|
||||||
|
- run: mv output/release/device/n0100/flasher.verbose.bin final-output/flasher.verbose.bin
|
||||||
- run: find final-output/ -type f -exec bash -c "shasum -a 256 -b {} > {}.sha256" \;
|
- run: find final-output/ -type f -exec bash -c "shasum -a 256 -b {} > {}.sha256" \;
|
||||||
- run: tar cvfz binpack-n0100.tgz final-output/*
|
- run: tar cvfz binpack-n0100.tgz final-output/*
|
||||||
- uses: actions/upload-artifact@master
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: epsilon-binpack-n0100.tgz
|
name: epsilon-binpack-n0100.tgz
|
||||||
path: binpack-n0100.tgz
|
path: binpack-n0100.tgz
|
||||||
|
- if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
repository: Yaya-Cout/Upsilon-binfiles
|
||||||
|
ref: 'main'
|
||||||
|
token: ${{ secrets.PAT_UPSILON_BINFILES }}
|
||||||
|
path: 'binfiles'
|
||||||
|
# TODO: Handle git conflicts using rebase
|
||||||
|
- name: Upload binary files to website
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
|
||||||
|
run: |
|
||||||
|
cp -r final-output/* binfiles/binaries/dev/n100
|
||||||
|
cd binfiles
|
||||||
|
git add -A
|
||||||
|
git config --global user.email "ci@github.com"
|
||||||
|
git config --global user.name "GitHub Upsilon CI"
|
||||||
|
git pull
|
||||||
|
git commit -m "Update from CI"
|
||||||
|
git push
|
||||||
n0110:
|
n0110:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04-arm
|
||||||
steps:
|
steps:
|
||||||
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
|
- run: |
|
||||||
- uses: numworks/setup-arm-toolchain@2020-q2
|
sudo apt-get update
|
||||||
- uses: actions/checkout@v2
|
sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
|
||||||
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
- run: make -j2 epsilon.dfu
|
- run: make -j2 MODEL=n0110 epsilon.dfu
|
||||||
- run: make -j2 epsilon.onboarding.dfu
|
- run: make -j2 MODEL=n0110 epsilon.onboarding.dfu
|
||||||
- run: make -j2 epsilon.onboarding.update.dfu
|
- run: make -j2 MODEL=n0110 epsilon.onboarding.update.dfu
|
||||||
- run: make -j2 epsilon.onboarding.beta.dfu
|
- run: make -j2 MODEL=n0110 epsilon.onboarding.beta.dfu
|
||||||
- run: make -j2 flasher.light.dfu
|
- run: make -j2 MODEL=n0110 flasher.light.dfu
|
||||||
- run: make -j2 flasher.verbose.dfu
|
- run: make -j2 MODEL=n0110 flasher.verbose.dfu
|
||||||
- run: make -j2 bench.ram.dfu
|
- run: make -j2 MODEL=n0110 flasher.verbose.bin
|
||||||
- run: make -j2 bench.flash.dfu
|
- run: make -j2 MODEL=n0110 bench.ram.dfu
|
||||||
- run: make -j2 binpack
|
# - run: make -j2 MODEL=n0110 bench.flash.dfu
|
||||||
|
- run: make -j2 MODEL=n0110 binpack
|
||||||
- run: cp output/release/device/n0110/binpack-n0110-`git rev-parse HEAD | head -c 7`.tgz output/release/device/n0110/binpack-n0110.tgz
|
- 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
|
- run: cp output/release/device/n0110/flasher.verbose.bin output/release/device/n0110/binpack/
|
||||||
|
- run: cd output/release/device/n0110 && for binary in *.bin; do shasum -a 256 -b binpack/${binary} > binpack/${binary}.sha256;done
|
||||||
|
- run: cp output/release/device/n0110/binpack-n0110-`git rev-parse HEAD | head -c 7`.tgz output/release/device/n0110/binpack/binpack.tgz
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: epsilon-binpack-n0110.tgz
|
name: epsilon-binpack-n0110.tgz
|
||||||
path: output/release/device/n0110/binpack-n0110.tgz
|
path: output/release/device/n0110/binpack-n0110.tgz
|
||||||
|
- if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
repository: Yaya-Cout/Upsilon-binfiles
|
||||||
|
ref: 'main'
|
||||||
|
token: ${{ secrets.PAT_UPSILON_BINFILES }}
|
||||||
|
path: 'binfiles'
|
||||||
|
# TODO: Handle git conflicts using rebase
|
||||||
|
- name: Upload binary files to website
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
|
||||||
|
run: |
|
||||||
|
cp -r output/release/device/n0110/binpack/* binfiles/binaries/dev/n110
|
||||||
|
cd binfiles
|
||||||
|
git add -A
|
||||||
|
git config --global user.email "ci@github.com"
|
||||||
|
git config --global user.name "GitHub Upsilon CI"
|
||||||
|
git pull
|
||||||
|
git commit -m "Update from CI"
|
||||||
|
git push
|
||||||
|
bootloader:
|
||||||
|
runs-on: ubuntu-24.04-arm
|
||||||
|
steps:
|
||||||
|
- run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
submodules: 'recursive'
|
||||||
|
- run: make -j2 MODEL=n0110 bootloader
|
||||||
|
- run: make -j2 epsilon.A.dfu epsilon.B.dfu
|
||||||
|
- run: make -j2 epsilon.onboarding.A.dfu
|
||||||
|
- run: make -j2 epsilon.onboarding.B.dfu
|
||||||
|
- run: make -j2 epsilon.onboarding.update.A.dfu
|
||||||
|
- run: make -j2 epsilon.onboarding.update.B.dfu
|
||||||
|
- run: make -j2 epsilon.onboarding.beta.A.dfu
|
||||||
|
- run: make -j2 epsilon.onboarding.beta.B.dfu
|
||||||
|
- run: make -j2 binpack
|
||||||
|
- run: cp output/release/device/bootloader/binpack-bootloader-`git rev-parse HEAD | head -c 7`.tgz output/release/device/bootloader/binpack-bootloader.tgz
|
||||||
|
- run: cp output/release/device/n0110/bootloader.bin output/release/device/bootloader/binpack/
|
||||||
|
- run: cp output/release/device/n0110/bootloader.bin output/release/device/bootloader/
|
||||||
|
- run: cd output/release/device/bootloader && for binary in *.bin; do shasum -a 256 -b binpack/${binary} > binpack/${binary}.sha256;done
|
||||||
|
- run: cd output/release/device/bootloader && tar cvfz binpack-bootloader.tgz binpack/*
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: epsilon-binpack-bootloader.tgz
|
||||||
|
path: output/release/device/bootloader/binpack-bootloader.tgz
|
||||||
|
- if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
repository: Yaya-Cout/Upsilon-binfiles
|
||||||
|
ref: 'main'
|
||||||
|
token: ${{ secrets.PAT_UPSILON_BINFILES }}
|
||||||
|
path: 'binfiles'
|
||||||
|
# TODO: Handle git conflicts using rebase
|
||||||
|
- name: Upload binary files to website
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
|
||||||
|
run: |
|
||||||
|
cp -r output/release/device/bootloader/binpack/* binfiles/binaries/dev/n110
|
||||||
|
cd binfiles
|
||||||
|
git add -A
|
||||||
|
git config --global user.email "ci@github.com"
|
||||||
|
git config --global user.name "GitHub Upsilon CI"
|
||||||
|
git pull
|
||||||
|
git commit -m "Update from CI"
|
||||||
|
git push
|
||||||
windows:
|
windows:
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
defaults:
|
defaults:
|
||||||
@@ -124,68 +368,215 @@ jobs:
|
|||||||
shell: msys2 {0}
|
shell: msys2 {0}
|
||||||
steps:
|
steps:
|
||||||
- uses: msys2/setup-msys2@v2
|
- uses: msys2/setup-msys2@v2
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
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: 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 git
|
||||||
- run: make -j2 PLATFORM=simulator
|
- run: make -j2 PLATFORM=simulator
|
||||||
- uses: actions/upload-artifact@master
|
- run: make -j2 PLATFORM=simulator test.exe
|
||||||
|
- run: cmd /c output\release\simulator\windows\test.exe --headless
|
||||||
|
- id: 'auth'
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: 'google-github-actions/auth@v0'
|
||||||
|
with:
|
||||||
|
credentials_json: '${{secrets.GOOGLE_CREDENTIALS}}'
|
||||||
|
- id: 'upload-file'
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: 'google-github-actions/upload-cloud-storage@v0'
|
||||||
|
with:
|
||||||
|
path: 'output/release/simulator/windows/epsilon.exe'
|
||||||
|
destination: 'upsilon-binfiles.appspot.com/dev/simulator/'
|
||||||
|
parent: false
|
||||||
|
- if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
repository: Yaya-Cout/Upsilon-binfiles
|
||||||
|
ref: 'main'
|
||||||
|
token: ${{ secrets.PAT_UPSILON_BINFILES }}
|
||||||
|
path: 'binfiles'
|
||||||
|
# TODO: Handle git conflicts using rebase
|
||||||
|
- name: Upload binary files to website
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
|
||||||
|
run: |
|
||||||
|
cp -r output/release/simulator/windows/epsilon.exe binfiles/binaries/dev/simulator
|
||||||
|
cd binfiles
|
||||||
|
git add -A
|
||||||
|
git config --global user.email "ci@github.com"
|
||||||
|
git config --global user.name "GitHub Upsilon CI"
|
||||||
|
git pull
|
||||||
|
git commit -m "Update from CI"
|
||||||
|
git push
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: epsilon-windows.exe
|
name: epsilon-windows.exe
|
||||||
path: output/release/simulator/windows/epsilon.exe
|
path: output/release/simulator/windows/epsilon.exe
|
||||||
web:
|
web:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: numworks/setup-emscripten@v1
|
- uses: numworks/setup-emscripten@master
|
||||||
with:
|
with:
|
||||||
sdk: latest-upstream
|
sdk: latest
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
|
# Install the Linux toolchin to avoid dependancies issues, but maybe only libpng is needed
|
||||||
|
- run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config libxtst-dev
|
||||||
- run: make -j2 PLATFORM=simulator TARGET=web
|
- run: make -j2 PLATFORM=simulator TARGET=web
|
||||||
- uses: actions/upload-artifact@master
|
- run: make -j2 PLATFORM=simulator TARGET=web test.js
|
||||||
|
- run: node output/release/simulator/web/test.js --headless
|
||||||
|
- id: 'auth'
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: 'google-github-actions/auth@v0'
|
||||||
|
with:
|
||||||
|
credentials_json: '${{secrets.GOOGLE_CREDENTIALS}}'
|
||||||
|
- id: 'upload-file'
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: 'google-github-actions/upload-cloud-storage@v0'
|
||||||
|
with:
|
||||||
|
path: 'output/release/simulator/web/epsilon.js'
|
||||||
|
destination: 'upsilon-binfiles.appspot.com/dev/simulator/'
|
||||||
|
parent: false
|
||||||
|
- if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
repository: Yaya-Cout/Upsilon-binfiles
|
||||||
|
ref: 'main'
|
||||||
|
token: ${{ secrets.PAT_UPSILON_BINFILES }}
|
||||||
|
path: 'binfiles'
|
||||||
|
# TODO: Handle git conflicts using rebase
|
||||||
|
- name: Upload binary files to website
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
|
||||||
|
run: |
|
||||||
|
cp -r output/release/simulator/web/epsilon.zip binfiles/binaries/dev/simulator
|
||||||
|
cd binfiles
|
||||||
|
git add -A
|
||||||
|
git config --global user.email "ci@github.com"
|
||||||
|
git config --global user.name "GitHub Upsilon CI"
|
||||||
|
git pull
|
||||||
|
git commit -m "Update from CI"
|
||||||
|
git push
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: epsilon-web.zip
|
name: epsilon-web.zip
|
||||||
path: output/release/simulator/web/epsilon.zip
|
path: output/release/simulator/web/epsilon.zip
|
||||||
linux:
|
linux:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
|
- run: |
|
||||||
- uses: actions/checkout@v2
|
sudo apt-get update
|
||||||
|
sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config libxtst-dev
|
||||||
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
- run: make -j2 PLATFORM=simulator
|
- run: make -j2 PLATFORM=simulator
|
||||||
- uses: actions/upload-artifact@master
|
- run: make -j2 PLATFORM=simulator test.bin
|
||||||
|
- run: output/release/simulator/linux/test.bin --headless
|
||||||
|
- id: 'auth'
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: 'google-github-actions/auth@v0'
|
||||||
|
with:
|
||||||
|
credentials_json: '${{secrets.GOOGLE_CREDENTIALS}}'
|
||||||
|
- id: 'upload-file'
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: 'google-github-actions/upload-cloud-storage@v0'
|
||||||
|
with:
|
||||||
|
path: 'output/release/simulator/linux/epsilon.bin'
|
||||||
|
destination: 'upsilon-binfiles.appspot.com/dev/simulator/'
|
||||||
|
parent: false
|
||||||
|
- if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
repository: Yaya-Cout/Upsilon-binfiles
|
||||||
|
ref: 'main'
|
||||||
|
token: ${{ secrets.PAT_UPSILON_BINFILES }}
|
||||||
|
path: 'binfiles'
|
||||||
|
# TODO: Handle git conflicts using rebase
|
||||||
|
- name: Upload binary files to website
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
|
||||||
|
run: |
|
||||||
|
cp -r output/release/simulator/linux/epsilon.bin binfiles/binaries/dev/simulator
|
||||||
|
cd binfiles
|
||||||
|
git add -A
|
||||||
|
git config --global user.email "ci@github.com"
|
||||||
|
git config --global user.name "GitHub Upsilon CI"
|
||||||
|
git pull
|
||||||
|
git commit -m "Update from CI"
|
||||||
|
git push
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: epsilon-linux.bin
|
name: epsilon-linux.bin
|
||||||
path: output/release/simulator/linux/epsilon.bin
|
path: output/release/simulator/linux/epsilon.bin
|
||||||
macos:
|
macos:
|
||||||
if: github.event.inputs.triggerMacos == 'yes'
|
if: github.event.inputs.triggerMacos == 'yes' || github.event.inputs.triggerMacos == ''
|
||||||
runs-on: macOS-latest
|
runs-on: macOS-latest
|
||||||
steps:
|
steps:
|
||||||
|
- run: brew install python-setuptools
|
||||||
- run: brew install numworks/tap/epsilon-sdk
|
- run: brew install numworks/tap/epsilon-sdk
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
- run: make -j2 PLATFORM=simulator
|
- run: make -j2 PLATFORM=simulator
|
||||||
- uses: actions/upload-artifact@master
|
- run: make -j2 PLATFORM=simulator ARCH=x86_64 test.bin
|
||||||
|
- run: output/release/simulator/macos/x86_64/test.bin --headless
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: epsilon-macos.zip
|
name: epsilon-macos.zip
|
||||||
path: output/release/simulator/macos/epsilon.app
|
path: output/release/simulator/macos/epsilon.app
|
||||||
|
- if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
repository: Yaya-Cout/Upsilon-binfiles
|
||||||
|
ref: 'main'
|
||||||
|
token: ${{ secrets.PAT_UPSILON_BINFILES }}
|
||||||
|
path: 'binfiles'
|
||||||
|
# TODO: Handle git conflicts using rebase
|
||||||
|
- name: Upload binary files to website
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
|
||||||
|
run: |
|
||||||
|
cp -r output/release/simulator/macos/epsilon.app binfiles/binaries/dev/simulator
|
||||||
|
cd binfiles
|
||||||
|
git add -A
|
||||||
|
git config --global user.email "ci@github.com"
|
||||||
|
git config --global user.name "GitHub Upsilon CI"
|
||||||
|
git pull
|
||||||
|
git commit -m "Update from CI"
|
||||||
|
git push
|
||||||
ios:
|
ios:
|
||||||
if: github.event.inputs.triggerIos == 'yes'
|
if: github.event.inputs.triggerIos == 'yes' || github.event.inputs.triggerIos == ''
|
||||||
runs-on: macOS-latest
|
runs-on: macos-14
|
||||||
steps:
|
steps:
|
||||||
|
- run: brew install python-setuptools
|
||||||
- run: brew install numworks/tap/epsilon-sdk
|
- run: brew install numworks/tap/epsilon-sdk
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
- run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0
|
- run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0
|
||||||
- run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0 APPLE_PLATFORM=ios-simulator
|
- run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0 APPLE_PLATFORM=ios-simulator
|
||||||
- uses: actions/upload-artifact@master
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: epsilon-ios.ipa
|
name: epsilon-ios.ipa
|
||||||
path: output/release/simulator/ios/epsilon.ipa
|
path: output/release/simulator/ios/epsilon.ipa
|
||||||
|
- if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
repository: Yaya-Cout/Upsilon-binfiles
|
||||||
|
ref: 'main'
|
||||||
|
token: ${{ secrets.PAT_UPSILON_BINFILES }}
|
||||||
|
path: 'binfiles'
|
||||||
|
# TODO: Handle git conflicts using rebase
|
||||||
|
- name: Upload binary files to website
|
||||||
|
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
|
||||||
|
run: |
|
||||||
|
cp -r output/release/simulator/ios/epsilon.ipa binfiles/binaries/dev/simulator
|
||||||
|
cd binfiles
|
||||||
|
git add -A
|
||||||
|
git config --global user.email "ci@github.com"
|
||||||
|
git config --global user.name "GitHub Upsilon CI"
|
||||||
|
git pull
|
||||||
|
git commit -m "Update from CI"
|
||||||
|
git push
|
||||||
|
|
||||||
env:
|
env:
|
||||||
ACCEPT_OFFICIAL_TOS: 1
|
ACCEPT_OFFICIAL_TOS: 1
|
||||||
|
|||||||
28
.github/workflows/metric-workflow.yml
vendored
28
.github/workflows/metric-workflow.yml
vendored
@@ -3,39 +3,43 @@ on: [pull_request_target]
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
binary-size:
|
binary-size:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04-arm
|
||||||
steps:
|
steps:
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
|
run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
|
||||||
- name: Install ARM toolchain
|
- name: Install ARM toolchain
|
||||||
uses: numworks/setup-arm-toolchain@2020-q2
|
run: sudo apt-get install gcc-arm-none-eabi binutils-arm-none-eabi
|
||||||
- name: Checkout PR base
|
- name: Checkout PR base
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
ref: ${{ github.event.pull_request.base.sha }}
|
ref: ${{ github.event.pull_request.base.sha }}
|
||||||
path: base
|
path: base
|
||||||
- name: Build base
|
- name: Build base
|
||||||
run: make -j2 -C base epsilon.elf
|
run: make -j2 -C base MODEL=n0110 epsilon.elf
|
||||||
- name: Checkout PR head
|
- name: Checkout PR head
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
path: head
|
path: head
|
||||||
- name: Build head
|
- name: Build head
|
||||||
run: make -j2 -C head epsilon.elf
|
run: make -j2 -C head MODEL=n0110 epsilon.elf
|
||||||
- name: Retrieve binary size analysis
|
- name: Retrieve binary size analysis
|
||||||
id: binary_size
|
run: |
|
||||||
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)"
|
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)"
|
||||||
|
{
|
||||||
|
echo 'table<<EOF'
|
||||||
|
echo "${table//%0A/$'\n'}"
|
||||||
|
echo EOF
|
||||||
|
} >> "$GITHUB_ENV"
|
||||||
- name: Add comment
|
- name: Add comment
|
||||||
uses: actions/github-script@v3.0.0
|
uses: actions/github-script@v8
|
||||||
with:
|
with:
|
||||||
github-token: ${{ secrets.OMEGA_ROBOT_TOKEN }}
|
|
||||||
script: |
|
script: |
|
||||||
await github.issues.createComment({
|
await github.rest.issues.createComment({
|
||||||
owner: context.repo.owner,
|
owner: context.repo.owner,
|
||||||
repo: context.repo.repo,
|
repo: context.repo.repo,
|
||||||
issue_number: context.payload.pull_request.number,
|
issue_number: context.payload.pull_request.number,
|
||||||
body: `${{ steps.binary_size.outputs.table }}`,
|
body: `${{ env.table }}`,
|
||||||
});
|
});
|
||||||
|
|||||||
14
.github/workflows/unit-workflow.yml
vendored
14
.github/workflows/unit-workflow.yml
vendored
@@ -1,14 +0,0 @@
|
|||||||
name: Unit tests
|
|
||||||
on: [pull_request_target]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
units:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
submodules: 'recursive'
|
|
||||||
- run: make -j2 PLATFORM=simulator test.headless.bin
|
|
||||||
- run: output/release/simulator/linux/test.headless.bin
|
|
||||||
|
|
||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -6,3 +6,7 @@ epsilon.map
|
|||||||
.vscode
|
.vscode
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.gradle
|
.gradle
|
||||||
|
.idea/
|
||||||
|
.vs
|
||||||
|
.cache/
|
||||||
|
compile_commands.json
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
image: gcc
|
|
||||||
|
|
||||||
stages:
|
|
||||||
- build
|
|
||||||
|
|
||||||
job:build:
|
|
||||||
stage: build
|
|
||||||
before_script:
|
|
||||||
- "echo 'deb http://httpredir.debian.org/debian jessie main contrib \n deb-src http://httpredir.debian.org/debian jessie main contrib \n deb http://httpredir.debian.org/debian jessie-updates main contrib \n deb-src http://httpredir.debian.org/debian jessie-updates main contrib \n deb http://security.debian.org/ jessie/updates main contrib \n deb-src http://security.debian.org/ jessie/updates main contrib ' > /etc/apt/source.list"
|
|
||||||
- "apt-get update"
|
|
||||||
- "apt -y install build-essential git imagemagick libx11-dev libxext-dev libfreetype6-dev libpng-dev libjpeg-dev pkg-config fltk1.3-dev gcc-arm-none-eabi nodejs npm"
|
|
||||||
- "git submodule update --init --recursive"
|
|
||||||
- "git clone https://github.com/RedGl0w/omega-auto-increment"
|
|
||||||
- "cd omega-auto-increment"
|
|
||||||
- "npm i request exeq"
|
|
||||||
- "PrivateToken=$PrivateToken node index.js"
|
|
||||||
- "cd .."
|
|
||||||
script:
|
|
||||||
- make clean
|
|
||||||
- make MODEL=n0100 epsilon.bin
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- output/release/device/n0100/epsilon.bin
|
|
||||||
- omega-auto-increment/version.txt
|
|
||||||
name: artifact:build:simulator
|
|
||||||
|
|
||||||
4
.gitmodules
vendored
4
.gitmodules
vendored
@@ -1,6 +1,6 @@
|
|||||||
[submodule "apps/rpn"]
|
[submodule "apps/rpn"]
|
||||||
path = apps/rpn
|
path = apps/rpn
|
||||||
url = https://github.com/Omega-Numworks/Omega-RPN.git
|
url = https://github.com/UpsilonNumworks/Upsilon-RPN.git
|
||||||
[submodule "apps/atomic"]
|
[submodule "apps/atomic"]
|
||||||
path = apps/atomic
|
path = apps/atomic
|
||||||
url = https://github.com/Omega-Numworks/Omega-Atomic.git
|
url = https://github.com/UpsilonNumworks/atomic
|
||||||
|
|||||||
45
Makefile
45
Makefile
@@ -12,16 +12,40 @@ include build/toolchain.$(TOOLCHAIN).mak
|
|||||||
include build/variants.mak
|
include build/variants.mak
|
||||||
include build/helpers.mk
|
include build/helpers.mk
|
||||||
|
|
||||||
ifeq (${MODEL}, n0110)
|
ifeq (${MODEL}, n0100)
|
||||||
apps_list = ${EPSILON_APPS}
|
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 ($(filter reader,$(apps_list)),)
|
||||||
|
HAS_READER := 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Remove the external apps for the n0100
|
||||||
|
ifeq (${MODEL}, n0100)
|
||||||
|
apps_list = $(foreach i, ${EPSILON_APPS}, $(if $(filter external, $(i)),,$(i)))
|
||||||
else
|
else
|
||||||
apps_list = $(foreach i, ${EPSILON_APPS}, $(if $(filter external, $(i)),,$(i)))
|
apps_list = ${EPSILON_APPS}
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef FORCE_EXTERNAL
|
ifdef FORCE_EXTERNAL
|
||||||
apps_list = ${EPSILON_APPS}
|
apps_list = ${EPSILON_APPS}
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(INCLUDE_ULAB), 1)
|
||||||
|
SFLAGS += -DINCLUDE_ULAB
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef HOME_DISPLAY_EXTERNALS
|
ifdef HOME_DISPLAY_EXTERNALS
|
||||||
ifneq ($(filter external,$(apps_list)),)
|
ifneq ($(filter external,$(apps_list)),)
|
||||||
SFLAGS += -DHOME_DISPLAY_EXTERNALS
|
SFLAGS += -DHOME_DISPLAY_EXTERNALS
|
||||||
@@ -69,6 +93,7 @@ help:
|
|||||||
@echo " make PLATFORM=simulator TARGET=web"
|
@echo " make PLATFORM=simulator TARGET=web"
|
||||||
@echo " make PLATFORM=simulator TARGET=windows"
|
@echo " make PLATFORM=simulator TARGET=windows"
|
||||||
@echo " make PLATFORM=simulator TARGET=3ds"
|
@echo " make PLATFORM=simulator TARGET=3ds"
|
||||||
|
@echo " make PLATFORM=simulator TARGET=fxcg"
|
||||||
|
|
||||||
.PHONY: doc
|
.PHONY: doc
|
||||||
doc:
|
doc:
|
||||||
@@ -82,7 +107,7 @@ print-%:
|
|||||||
@echo $*\'s origin is $(origin $*)
|
@echo $*\'s origin is $(origin $*)
|
||||||
|
|
||||||
# Since we're building out-of-tree, we need to make sure the output directories
|
# 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
|
# are created, otherwise the recipes will fail (e.g. gcc will fail to create
|
||||||
# "output/foo/bar.o" because the directory "output/foo" doesn't exist).
|
# "output/foo/bar.o" because the directory "output/foo" doesn't exist).
|
||||||
# We need to mark those directories as precious, otherwise Make will try to get
|
# We need to mark those directories as precious, otherwise Make will try to get
|
||||||
# rid of them upon completion (and fail, since those folders won't be empty).
|
# rid of them upon completion (and fail, since those folders won't be empty).
|
||||||
@@ -103,6 +128,7 @@ ifndef USE_LIBA
|
|||||||
endif
|
endif
|
||||||
ifeq ($(USE_LIBA),0)
|
ifeq ($(USE_LIBA),0)
|
||||||
include liba/Makefile.bridge
|
include liba/Makefile.bridge
|
||||||
|
include libaxx/Makefile.bridge
|
||||||
else
|
else
|
||||||
SFLAGS += -ffreestanding -nostdinc -nostdlib
|
SFLAGS += -ffreestanding -nostdinc -nostdlib
|
||||||
include liba/Makefile
|
include liba/Makefile
|
||||||
@@ -114,6 +140,7 @@ include poincare/Makefile
|
|||||||
include python/Makefile
|
include python/Makefile
|
||||||
include escher/Makefile
|
include escher/Makefile
|
||||||
# Executable Makefiles
|
# Executable Makefiles
|
||||||
|
include bootloader/Makefile
|
||||||
include apps/Makefile
|
include apps/Makefile
|
||||||
include build/struct_layout/Makefile
|
include build/struct_layout/Makefile
|
||||||
include build/scenario/Makefile
|
include build/scenario/Makefile
|
||||||
@@ -186,3 +213,13 @@ clean_run: cleanandcompile
|
|||||||
.PHONY: run
|
.PHONY: run
|
||||||
run: compile
|
run: compile
|
||||||
${MAKE} start
|
${MAKE} start
|
||||||
|
|
||||||
|
.PHONY: translations
|
||||||
|
translations:
|
||||||
|
@echo "TRANSLATIONS"
|
||||||
|
$(Q) ${PYTHON} build/utilities/translate.py
|
||||||
|
|
||||||
|
.PHONY: translations_clean
|
||||||
|
translations_clean:
|
||||||
|
@echo "TRANSLATIONS CLEAN"
|
||||||
|
$(Q) ${PYTHON} build/utilities/translations_clean.py
|
||||||
|
|||||||
498
README.fr.md
498
README.fr.md
@@ -1,177 +1,507 @@
|
|||||||
<p align="center"><img src="https://user-images.githubusercontent.com/12123721/111199951-80bd3d00-85c1-11eb-936c-28cf590208b8.png" /></p>
|
<p align="center"><img src="https://github.com/Laporte12974/UpsilonDesign/blob/89a15953ae128aef8aa7d066dcaaf8d5c70f02a5/UPSILogo.png" /></p>
|
||||||
|
|
||||||
<p align="center">
|
<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://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/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>
|
<a href="https://github.com/UpsilonNumworks/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/>
|
<br/>
|
||||||
<a href="https://discord.gg/X2TWhh9"><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>
|
<a href="https://discord.gg/sbGvhWETAd"><img alt="Discord" src="https://img.shields.io/discord/663420259851567114?color=blue&labelColor=292929&label=chat%20-%20discord&logo=discord&style=for-the-badge" /></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
> Don't understand french ? speak english ? here's the [english README](./README.md) !
|
> Don't understand French ? Speak English ? here's the [english README](./README.md) !
|
||||||
|
|
||||||
## À propos
|
## À propos
|
||||||
|
|
||||||
Omega est un fork d'Epsilon, l'OS de Numworks tournant sur les calculatrices du même nom, qui apporte beaucoup de fonctionnalités en plus. Omega est fait pour ceux qui aimeraient ajouter certaines fonctionnalités ayant été rejetées par Numworks à leurs calculatrices (pour des raisons 100% compréhensibles !). [Essayez en ligne](https://getomega.web.app/simulator).
|
Upsilon est un fork d'Omega, un fork d'Epsilon, l'OS de NumWorks tournant sur les calculatrices du même nom, qui apporte beaucoup de fonctionnalités en plus, mais qui fut archivé et fermé pour des raisons légales après un changement de politique de NumWorks. Upsilon est fait pour ceux qui aimeraient voir un futur pour les OS créés par les utilisateurs pour NumWorks, même après l'arrêt du projet initial.
|
||||||
|
|
||||||
### Quelques fonctionnalités supplémentaires
|
### Quelques fonctionnalités supplémentaires
|
||||||
- Retour du calcul littéral
|
|
||||||
- Une application RPN
|
- Un module Python Kandinsky amélioré
|
||||||
- Application Externes
|
- Un support pour fonds d'écrans personnalisés
|
||||||
- Des thèmes
|
- Des applications externes
|
||||||
- Python amélioré (module os, méthode open...)
|
- Un thème Upsilon
|
||||||
- Un tableau périodique et toutes les masses molaires des éléments dans la toolbox
|
- La surcharge des opérateurs en Python
|
||||||
- *Ainsi que d'autres à découvrir...* [Changelogs complets](https://github.com/Omega-Numworks/Omega/wiki/Changelog) | [Fonctionnalités princpales & captures d'écran](https://github.com/Omega-Numworks/Omega/wiki/Main-features).
|
- 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
|
## Installation
|
||||||
|
|
||||||
### Automatique
|
### Site web
|
||||||
|
|
||||||
Vous pouvez installer Omega automatiquement depuis [notre site](https://getomega.web.app/) sur la page "installer".
|
Rendez-vous sur le [site d'Upsilon](https://getupsilon.web.app/) à la section "Installer".
|
||||||
|
Si votre calculatrice est reconnue, qu'elle contient une version d'Epsilon inférieure à 16 et que votre navigateur accepte WebUSB, la page vous proposera d'installer Upsilon.
|
||||||
<a href="https://getomega.web.app"><p align="center"><img alt="Omega Banner Discord" src="https://user-images.githubusercontent.com/12123721/86352956-e9000480-bc66-11ea-82b7-79fd7e56fa27.png" /></p></a>
|
Ne débranchez votre calculatrice qu'une fois l'installation terminée.
|
||||||
|
|
||||||
### Manuelle
|
### Manuelle
|
||||||
|
|
||||||
Tout d'abord, suivez **la première étape** [ici](https://www.numworks.com/resources/engineering/software/build/), puis :
|
*Vous pouvez vous référer à ce [site internet](https://www.numworks.com/resources/engineering/software/build/) pour la première étape si vous avez des erreurs*
|
||||||
|
|
||||||
|
### 1. Installation du SDK
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><b>Modèle n0100</b></summary>
|
|
||||||
|
|
||||||
(note : vous pouvez changer `EPSILON_I18N=fr` en `en`, `nl`, `pt`, `it`, `de`, `es` ou `hu`).
|
<summary><b>1.1 Linux</b></summary>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Debian ou Ubuntu</summary>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
Il suffit juste d'installer les dépendances en tapant ces commandes dans un terminal en mode super-utilisateur.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
apt-get install build-essential git imagemagick libx11-dev libxext-dev libfreetype6-dev libpng-dev libjpeg-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
|
||||||
|
```
|
||||||
|
|
||||||
|
C'est fait ! Vous pouvez aller à l'étape 2.
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Fedora</summary>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
Installez toutes les dépendances grâce à cette commande :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dnf install make automake gcc gcc-c++ kernel-devel git ImageMagick libX11-devel libXext-devel freetype-devel libpng-devel libjpeg-devel pkg-config arm-none-eabi-gcc-cs arm-none-eabi-gcc-cs-c++
|
||||||
|
```
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Nix/Nixos</summary>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
Installez toutes les dépendances grâce à cette commande :
|
||||||
|
```bash
|
||||||
|
nix-env -p gcc libpng libjpeg xorg.libX11 pkg-config freetype xorg.libXext python3 imagemagick python310Packages.lz4 python310Packages.pypng python310Packages.pypng gcc-arm-embedded
|
||||||
|
```
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary><b>1.2 Mac</b></summary>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
Il est recommandé d'utiliser [Homebrew](https://brew.sh/). Une fois installé, utilisez :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew install numworks/tap/epsilon-sdk
|
||||||
|
```
|
||||||
|
|
||||||
|
Et toutes les dépendances seront installées.
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
Vous pouvez aller à l'étape 2.
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary><b>1.3 Windows</b></summary>
|
||||||
|
|
||||||
|
[Git](http://git-scm.com) doit être installé.
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Avec Msys2/Mingw (Supportés par NumWorks bien qu'il y ait beaucoup de bugs)</summary>
|
||||||
|
|
||||||
|
L'environnement de compilation [Msys2](https://www.msys2.org/) est recommandé par NumWorks pour obtenir la plupart des outils requis facilement. C'est ici que vous allez copier-coller toutes les commandes de ce tutoriel. Une fois installé, copiez-collez ces deux commandes dans le terminal:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-freetype mingw-w64-x86_64-pkg-config mingw-w64-x86_64-libusb git make python
|
||||||
|
echo "export PATH=/mingw64/bin:$PATH" >> .bashrc
|
||||||
|
```
|
||||||
|
|
||||||
|
Ensuite, vous devrez installer [GCC toolchain for ARM](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads). Quand il vous est demandé de choisir un dossier d'installation, choisissez `C:\msys64\home\User\gcc-arm\`. Il vous faudra ensuite ajouter ce dossier à votre $PATH. Tapez juste:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo "export PATH=$PATH:$HOME/gcc-arm/bin" >> .bashrc
|
||||||
|
```
|
||||||
|
|
||||||
|
Redémarrez votre terminal et vous pouvez aller à l'étape 2!
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Avec WSL 2</summary>
|
||||||
|
|
||||||
|
WSL est un système qui virtualise un environnement GNU/Linux dans Windows.
|
||||||
|
|
||||||
|
Votre version de Windows doit être >= 1903.
|
||||||
|
|
||||||
|
#### Installation de WSL
|
||||||
|
|
||||||
|
1. Apuyez simultanément sur les touches "Windows" et "X" puis cliquez sur "PowerShell Administrateur". Entrez ensuite ceci dans la nouvelle fenêtre:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
|
||||||
|
```
|
||||||
|
|
||||||
|
Cette commande active WSL
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
|
||||||
|
```
|
||||||
|
|
||||||
|
Cette commande permet d'autoriser le démarrage des machines signées par Microsoft.
|
||||||
|
|
||||||
|
2. Redémarrez votre ordinateur.
|
||||||
|
|
||||||
|
3. Téléchargez [ce fichier](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi) et suivez les instructions d'installation.
|
||||||
|
|
||||||
|
4. Ouvrez votre fenêtre PowerShell comme avant et tapez:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
wsl --set-default-version 2
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Téléchargez [Ubuntu](https://www.microsoft.com/store/apps/9n6svws3rx71) depuis le Microsoft store. Vous pouvez aussi installer [Debian](https://www.microsoft.com/store/productI9MSVKQC78PK6) à la place.
|
||||||
|
|
||||||
|
WSL est maintenant installé.
|
||||||
|
|
||||||
|
6. Installez maintenant la version pour ARM de GCC.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install build-essential git imagemagick libx11-dev libxext-dev libfreetype6-dev libpng-dev libjpeg-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
|
||||||
|
```
|
||||||
|
|
||||||
|
### Installation d'usbipd pour connecter la calculatrice à WSL (facultatif)
|
||||||
|
|
||||||
|
Pour connecter la calculatrice, il faut installer cet [outil](hthttps://github.com/dorssel/usbipd-win/releases/download/v5.0.0/usbipd-win_5.0.0_x64.msi). Il permet de connecter des périphériques par Internet. Suivez les instructions pour l'installer.
|
||||||
|
|
||||||
|
#### Ubuntu
|
||||||
|
|
||||||
|
1. Dans un terminal WSL Ubuntu, tapez :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install linux-tools-generic hwdata
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- 2. Editez /etc/sudoers pour que l'on puisse utiliser la commande usbip. Sur Ubuntu, cela est fait de cette manière :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo visudo
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Ajoutez `/usr/lib/linux-tools/5.4.0-77-generic` au début du secure_path. Après édition, la ligne devrait ressembler à:
|
||||||
|
`Defaults secure_path="/usr/lib/linux-tools/5.4.0-77-generic:/usr/local/sbin:..."` -->
|
||||||
|
|
||||||
|
#### Debian
|
||||||
|
|
||||||
|
1.Si vous utilisez Debian, lancez cette commande:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install usbip hwdata usbutils
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pour connecter la calculatrice à WSL
|
||||||
|
|
||||||
|
1. Ouvrez à nouveau un PowerShell en mode administrateur et tapez :
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
usbipd list
|
||||||
|
```
|
||||||
|
|
||||||
|
Ceci va lister les périphériques USB connectés à l'ordinateur. Regardez le BUSID de votre "Numworks Calculator".
|
||||||
|
|
||||||
|
2. Maintenant, lancez cette commande en remplaçant <BUSID> par celui de votre calculatrice :
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
usbipd bind --busid <BUSID>
|
||||||
|
usbipd attach --wsl --busid <BUSID>
|
||||||
|
```
|
||||||
|
|
||||||
|
Le mot de passe de votre machine WSL vous sera demandé.
|
||||||
|
|
||||||
|
Vous pouvez aller à l'étape 2.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
### 2. Récupérer le code source
|
||||||
|
|
||||||
|
Le code source est disponible dans une repository git. Récupérez-le de cette manière :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone --recursive https://github.com/UpsilonNumworks/Upsilon.git
|
||||||
|
cd Upsilon
|
||||||
|
git checkout upsilon-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
### 3. Choisissez le système à compiler
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary><b>Model n0100</b></summary>
|
||||||
|
|
||||||
|
(note: vous pouvez changer l'argument `EPSILON_I18N=en` avec `fr`, `nl`, `pt`, `it`, `de`, `es` or `hu`).
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone --recursive https://github.com/Omega-Numworks/Omega.git
|
|
||||||
cd Omega
|
|
||||||
git checkout omega-master
|
|
||||||
make MODEL=n0100 clean
|
make MODEL=n0100 clean
|
||||||
make MODEL=n0100 EPSILON_I18N=fr OMEGA_USERNAME="{Votre nom ici, 15 caractères max}" -j4
|
make MODEL=n0100 EPSILON_I18N=en OMEGA_USERNAME="{Votre nom, maximum 15 caractères}" -j4
|
||||||
|
```
|
||||||
|
|
||||||
|
Maintenant, lancez soit:
|
||||||
|
|
||||||
|
```bash
|
||||||
make MODEL=n0100 epsilon_flash
|
make MODEL=n0100 epsilon_flash
|
||||||
```
|
```
|
||||||
|
|
||||||
Important : N'oubliez pas l'argument `--recursive`, Omega a besoin de sous-modules.
|
pour directement flasher la calculatrice après avoir appuyé simultanément sur `reset` et `6` et avoir branché la calculatrice à l'ordinateur.
|
||||||
Vous pouvez aussi changer le nombre de processus parallèles pendant la compilation en changeant la valeur suivant `-j`.
|
|
||||||
|
|
||||||
</details>
|
<br>
|
||||||
|
|
||||||
<details>
|
soit:
|
||||||
<summary><b>Modèle n0110</b></summary>
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone --recursive https://github.com/Omega-Numworks/Omega.git
|
make MODEL=n0100 OMEGA_USERNAME="" binpack -j4
|
||||||
cd Omega
|
|
||||||
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`, Omega a besoin de sous-modules.
|
pour compiler les binpacks que vous pouvez distribuer et flasher depuis le [WebDFU de TI-Planet](https://ti-planet.github.io/webdfu_numworks/n0100/).
|
||||||
Vous pouvez aussi changer le nombre de processus parallèles pendant la compilation en changeant la valeur suivant `-j`.
|
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><b>Fichiers binaires</b></summary>
|
|
||||||
|
<summary><b>Model n0110</b></summary>
|
||||||
Ces fichiers peuvent être utilisés pour distribuer Omega (pour que tout le monde puisse le flasher via [Webdfu_Numworks](https://ti-planet.github.io/webdfu_numworks/)).
|
|
||||||
|
Le bootloader vous permet d'installer 2 firmwares dans des "slots" séparés. Dans ce cas les applications externes ne pourront pas utiliser toute la mémoire mais la moitié. Si un seul slot est utilisé, le bootloader permettra d'utiliser toute la mémoire. Sans bootloader, les apps externes peuvent utiliser toute la mémoire.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Bootloader</summary>
|
||||||
|
|
||||||
|
Votre calculatrice doit être flashé avec le bootloader d'[Upsilon](https://getupsilon.web.app) ou d'[Omega](https://getomega.dev).
|
||||||
|
Compilez avec:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone --recursive https://github.com/Omega-Numworks/Omega.git
|
|
||||||
cd Omega
|
|
||||||
git checkout omega-master
|
|
||||||
make clean
|
make clean
|
||||||
make MODEL=n0100 OMEGA_USERNAME="" -j8
|
make OMEGA_USERNAME="{Votre nom, max 15 caractères}" -j4
|
||||||
make MODEL=n0100 OMEGA_USERNAME="" binpack -j8
|
|
||||||
make OMEGA_USERNAME="" -j8
|
|
||||||
make OMEGA_USERNAME="" binpack -j8
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Important : N'oubliez pas l'argument `--recursive`, Omega a besoin de sous-modules.
|
Ensuite lancez soit:
|
||||||
Vous pouvez aussi changer le nombre de processus parallèles pendant la compilation en changeant la valeur suivant `-j`.
|
|
||||||
|
```bash
|
||||||
|
make epsilon.A_flash
|
||||||
|
```
|
||||||
|
|
||||||
|
pour flasher le slot actuel ou pour flasher par le flasher du booloader avec RESET, puis 4 (flash) et 1 (flash slots) pour flasher n'importe quel slot.
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
soit:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make OMEGA_USERNAME="{Votre nom, max 15 caractères}" binpack -j4
|
||||||
|
```
|
||||||
|
|
||||||
|
pour compiler les binpacks que vous pouvez distribuer et flasher depuis le [WebDFU de TI-Planet](https://ti-planet.github.io/webdfu_numworks/n0100/). Vous les trouverez dans `output/release/device/bootloader/`.
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><b>Simulateur web</b></summary>
|
|
||||||
|
<summary>Model n0110 sans bootloader (obsolète, utilisez le bootloader à la place pour la protection contre Epsilon)</summary>
|
||||||
|
Compilez avec:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make MODEL=n0110 clean
|
||||||
|
make MODEL=n0110 OMEGA_USERNAME="{Votre nom, max 15 caractères}" -j4
|
||||||
|
```
|
||||||
|
|
||||||
|
Ensuite lancez soit:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make MODEL=n0110 epsilon_flash
|
||||||
|
```
|
||||||
|
|
||||||
|
pour directement flasher la calculatrice après avoir appuyé simultanément sur `RESET` et `6` et avoir branché la calculatrice à l'ordinateur.
|
||||||
|
<br>
|
||||||
|
|
||||||
|
soit:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make MODEL=n0110 OMEGA_USERNAME="{Votre nom, max 15 caractères}" binpack -j4
|
||||||
|
```
|
||||||
|
|
||||||
|
pour compiler les binpacks que vous pouvez distribuer et flasher depuis le [WebDFU de TI-Planet](https://ti-planet.github.io/webdfu_numworks/n0100/). Vous les trouverez dans `output/release/device/n0110/`.
|
||||||
|
</details>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary><b>Simulateur Natif</b></summary>
|
||||||
|
|
||||||
|
Lancez cette commande:
|
||||||
|
```bash
|
||||||
|
make clean
|
||||||
|
```
|
||||||
|
Vous pouvez soit choisir d'utiliser la commmande qui détectera automatiquement votre plateforme:
|
||||||
|
```bash
|
||||||
|
make PLATFORM=simulator
|
||||||
|
```
|
||||||
|
Ou choisir une commande qui correspond à votre plateforme:
|
||||||
|
```bash
|
||||||
|
make PLATFORM=simulator TARGET=android
|
||||||
|
make PLATFORM=simulator TARGET=ios
|
||||||
|
make PLATFORM=simulator TARGET=macos
|
||||||
|
make PLATFORM=simulator TARGET=web
|
||||||
|
make PLATFORM=simulator TARGET=windows
|
||||||
|
make PLATFORM=simulator TARGET=3ds
|
||||||
|
```
|
||||||
|
|
||||||
|
Vous trouverez les fichiers du simulateur dans `output/release/simulator/`.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary><b>Simulateur web</b></summary>
|
||||||
|
|
||||||
D'abord, installez emsdk :
|
D'abord, installez emsdk :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/emscripten-core/emsdk.git
|
git clone https://github.com/emscripten-core/emsdk.git
|
||||||
cd emsdk
|
cd emsdk
|
||||||
./emsdk install latest-fastcomp
|
./emsdk install 1.40.1
|
||||||
./emsdk activate latest-fastcomp
|
./emsdk activate 1.40.1
|
||||||
source emsdk_env.sh
|
source emsdk_env.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Puis, compilez Omega :
|
Puis, compilez Upsilon :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone --recursive https://github.com/Omega-Numworks/Omega.git
|
|
||||||
cd Omega
|
|
||||||
git checkout omega-master
|
|
||||||
make clean
|
make clean
|
||||||
make PLATFORM=simulator TARGET=web OMEGA_USERNAME="{Votre nom ici, 15 caractères max}" -j4
|
make PLATFORM=simulator TARGET=web OMEGA_USERNAME="{Votre nom, maximum 15 caractères}" -j4
|
||||||
```
|
```
|
||||||
|
|
||||||
Le simulateur se trouve dans `output/release/simulator/web/simulator.zip`
|
Le simulateur se trouve dans `output/release/simulator/web/simulator.zip`
|
||||||
|
|
||||||
Important : N'oubliez pas l'argument `--recursive`, Omega a besoin de sous-modules.
|
</details>
|
||||||
Vous pouvez aussi changer le nombre de processus parallèles pendant la compilation en changeant la valeur suivant `-j`.
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary><b>Simulateur Android</b></summary>
|
||||||
|
|
||||||
|
Assurez-vous d'avoir JDK 25 d'installé.
|
||||||
|
Ensuite, téléchargez la toolchain Android version r21e comme suit :
|
||||||
|
```
|
||||||
|
export ANDROID_HOME=$PWD/android-sdk
|
||||||
|
wget -nv https://gitlab.com/fdroid/sdkmanager/-/raw/master/sdkmanager.py
|
||||||
|
python3 sdkmanager.py --licenses
|
||||||
|
python3 sdkmanager.py --install "ndk-bundle;r21e"
|
||||||
|
```
|
||||||
|
Il ne vous reste plus qu'à lancer cette commande pour compiler Upsilon.
|
||||||
|
```
|
||||||
|
make -j$(nproc) PLATFORM=simulator TARGET=android
|
||||||
|
```
|
||||||
|
Le fichier compilé nommé `epsilon.apk` sera celui à installer sur le téléphone depuis votre gestionnaire de fichier. Fonctionne normalement à partir de Android 4.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><b>Simulateur 3DS</b></summary>
|
|
||||||
|
<summary><b>Simulateur pour 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))
|
|
||||||
|
Il vous faut devkitPro et devkitARM installés et dans votre path (les instructions sont [ici](https://devkitpro.org/wiki/Getting_Started))
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone --recursive https://github.com/Omega-Numworks/Omega.git
|
git clone --recursive https://github.com/UpsilonNumworks/Upsilon.git
|
||||||
cd Omega
|
cd Upsilon
|
||||||
git checkout --recursive omega-dev
|
git checkout --recursive upsilon-dev
|
||||||
make PLATFORM=simulator TARGET=3ds -j
|
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 :
|
Vous pouvez ensuite mettre epsilon.3dsx sur une carte SD pour le lancer depuis le HBC ou utilisez 3dslink pour le lancer via le réseau:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
3dslink output/release/simulator/3ds/epsilon.3dsx -a <ADRESSE IP 3DS>
|
3dslink output/release/simulator/3ds/epsilon.3dsx -a <3DS' IP ADDRESS>
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
Si vous avez besoin d'aide, n'hésitez pas à rejoindre notre serveur discord : https://discord.gg/X2TWhh9
|
<br>
|
||||||
|
|
||||||
<a href="https://discord.gg/X2TWhh9"><p align="center"><img alt="Omega Banner Discord" src="https://user-images.githubusercontent.com/12123721/86287349-54ef5800-bbe8-11ea-80c1-34eb1f93eebd.png" /></p></a>
|
Important: n'oubliez pas l'argument `--recursive` parce qu'Upsilon dépend de submodules.
|
||||||
|
Aussi, vous pouvez changer le nombre de processus de compilation en parallèles en changeant le nombre après l'argument `-j`.
|
||||||
|
N'oubliez pas de mettre votre nom à la place `{Votre nom, maximum 15 caractères}`. Si vous n'en voulez pas, enlevez l'argument `OMEGA_USERNAME`.
|
||||||
|
|
||||||
|
Si vous avez besoin d'aide, n'hésitez pas à rejoindre notre serveur Discord : <https://discord.gg/Q9buEMduXG>
|
||||||
|
|
||||||
|
<a href="https://discord.gg/Q9buEMduXG"><p align="center"><img alt="Omega Banner Discord" src="https://user-images.githubusercontent.com/12123721/86287349-54ef5800-bbe8-11ea-80c1-34eb1f93eebd.png" /></p></a>
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Liens utiles
|
||||||
|
|
||||||
|
- [Upsilon-External (pour installer des applications supplémentaires et des fonds d'écran)](https://upsilonnumworks.github.io/Upsilon-External/)
|
||||||
|
- [Documentation d'Ulab](https://micropython-ulab.readthedocs.io/en/latest/)
|
||||||
|
|
||||||
## Contribution
|
## Contribution
|
||||||
|
|
||||||
Pour contribuer, merci de lire le [Wiki](https://github.com/Omega-Numworks/Omega/wiki/Contributing)
|
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.
|
||||||
|
|
||||||
## Nos autres projets
|
## Les autres projets
|
||||||
|
|
||||||
* [Omega Themes](https://github.com/Omega-Numworks/Omega-Themes)
|
Les anciens projets d'Omega, avant sa fermeture, qui ont été utilisés pour ce projet
|
||||||
* [Omega Website](https://github.com/Omega-Numworks/Omega-Website)
|
|
||||||
* [Omega RPN `APP`](https://github.com/Omega-Numworks/Omega-RPN)
|
- [Omega Themes](https://github.com/Omega-Numworks/Omega-Themes)
|
||||||
* [Omega Atomic `APP`](https://github.com/Omega-Numworks/Omega-Atomic)
|
- [Omega Website](https://github.com/Omega-Numworks/Omega-Website)
|
||||||
* [Omega Design](https://github.com/Omega-Numworks/Omega-Design)
|
- [Omega RPN `APP`](https://github.com/Omega-Numworks/Omega-RPN)
|
||||||
* [Omega Discord Bot](https://github.com/Omega-Numworks/Omega-Discord-Bot)
|
- [Omega Atomic `APP`](https://github.com/Omega-Numworks/Omega-Atomic)
|
||||||
* [Omega App Template `BETA`](https://github.com/Omega-Numworks/Omega-App-Template)
|
- [Omega Design](https://github.com/Omega-Numworks/Omega-Design)
|
||||||
* [External Apps](https://github.com/Omega-Numworks/External-Apps)
|
- [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
|
## À propos d'Epsilon
|
||||||
|
|
||||||
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
|
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érieures.
|
||||||
|
|
||||||
Vous pouvez essayer Epsilon depuis votre navigateur sur le [simulateur en ligne](https://www.numworks.com/simulator/).
|
Vous pouvez essayer Epsilon depuis votre navigateur sur le [simulateur en ligne](https://www.numworks.com/simulator/).
|
||||||
|
|
||||||
## Licence
|
## Licence
|
||||||
|
|
||||||
NumWorks est une marque déposée de NumWorks SAS, 24 Rue Godot de Mauroy, 75009 Paris, France.
|
NumWorks est une marque déposée de NumWorks SAS, 24 Rue Godot de Mauroy, 75009 Paris, France.
|
||||||
Nintendo est Nintendo 3DS sont des marques déposées de Nintendo of America Inc, 4600 150th Ave NE, Redmond, WA 98052, Etats-Unis.
|
Nintendo et Nintendo 3DS sont des marques déposées de Nintendo of America Inc, 4600 150th Ave NE, Redmond, WA 98052, Etats-Unis.
|
||||||
NumWorks SAS et Nintendo of America Inc ne sont en aucun cas associés avec ce projet.
|
NumWorks 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).
|
- NumWorks Epsilon est disponible sous [licence CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.fr).
|
||||||
* Omega est disponible sous [Lisense CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).
|
- Omega est disponible sous [licence CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.fr).
|
||||||
|
- Upsilon est disponible sous [licence CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.fr).
|
||||||
|
|||||||
520
README.md
520
README.md
@@ -1,137 +1,439 @@
|
|||||||
<p align="center"><img src="https://user-images.githubusercontent.com/12123721/111199951-80bd3d00-85c1-11eb-936c-28cf590208b8.png" /></p>
|
<p align="center"><img src="https://github.com/Laporte12974/UpsilonDesign/blob/89a15953ae128aef8aa7d066dcaaf8d5c70f02a5/UPSILogo.png" /></p>
|
||||||
|
|
||||||
<p align="center">
|
<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://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/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>
|
<a href="https://github.com/UpsilonNumworks/Upsilon/issues"><img alt="Issues" src="https://img.shields.io/github/issues/UpsilonNumworks/Upsilon.svg?labelColor=292929&logo=git&style=for-the-badge" /></a>
|
||||||
<br/>
|
<br/>
|
||||||
<a href="https://discord.gg/X2TWhh9"><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>
|
<a href="https://discord.gg/hnEqPzAJzn"><img alt="Discord" src="https://img.shields.io/discord/663420259851567114?color=blue&labelColor=292929&label=chat%20-%20discord&logo=discord&style=for-the-badge" /></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
> Vous ne comprenez pas l'anglais ? vous êtes francophone ? Regardez le [*LISEZ-MOI* français](./README.fr.md) !
|
> 🇫🇷 Vous ne comprenez pas l'anglais ? Vous êtes francophone ? Regardez le [*LISEZ-MOI* français](./README.fr.md) ! 🇫🇷
|
||||||
|
|
||||||
## About
|
## About
|
||||||
|
|
||||||
Omega is a fork of Numworks' Epsilon, the OS that runs on their calculator, which brings many features to it. Omega is for the people who want to add features to the calculator, but cannot because they have been rejected by Numworks (for reasons that are 100% understandable!). [Try it online](https://getomega.web.app/simulator).
|
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
|
### Some new features
|
||||||
- Adding symbolic calculation back into the calculator
|
|
||||||
- An app for RPN
|
- Enhancements for the Kandinsky python module
|
||||||
- Exernal apps
|
- Support for wallpapers
|
||||||
- A theme engine
|
- External apps
|
||||||
- New python features (os module, open method...)
|
- A custom theme
|
||||||
- A periodic table app + all of the molar masses for the elements in the toolbox
|
- Operator overload for python
|
||||||
- *And much more to discover...* [Complete changelog](https://github.com/Omega-Numworks/Omega/wiki/Changelog) | [Main new features + screenshots](https://github.com/Omega-Numworks/Omega/wiki/Main-features).
|
- 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
|
## Installation
|
||||||
|
|
||||||
### Automatic
|
### Installer
|
||||||
|
|
||||||
You can install Omega automatically on our website [here](https://getomega.web.app/) in the "install" page.
|
Go to the [Upsilon website](https://getupsilon.web.app/) to the "Install" section.
|
||||||
|
If your calculator is recognized, contains a version of Epsilon lower than 16 and your browser accepts WebUSB, the page will suggest you to install Upsilon.
|
||||||
<a href="https://getomega.web.app"><p align="center"><img alt="Omega Banner Discord" src="https://user-images.githubusercontent.com/12123721/86352956-e9000480-bc66-11ea-82b7-79fd7e56fa27.png" /></p></a>
|
Do not disconnect your calculator until the installation is complete.
|
||||||
|
|
||||||
### Manual
|
### Manual
|
||||||
|
|
||||||
First of all, follow **step 1** [here](https://www.numworks.com/resources/engineering/software/build/). Then:
|
*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>
|
<details>
|
||||||
<summary><b>Model n0100</b></summary>
|
|
||||||
|
<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>
|
||||||
|
|
||||||
|
To install all dependencies:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dnf install make automake gcc gcc-c++ kernel-devel git ImageMagick libX11-devel libXext-devel freetype-devel libpng-devel libjpeg-devel pkg-config arm-none-eabi-gcc-cs arm-none-eabi-gcc-cs-c++
|
||||||
|
```
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>Nix or Nixos</summary>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
To install all dependencies:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix-shell -p gcc libpng libjpeg xorg.libX11 pkg-config freetype xorg.libXext python3 imagemagick python310Packages.lz4 python310Packages.pypng python310Packages.pypng gcc-arm-embedded
|
||||||
|
```
|
||||||
|
|
||||||
|
<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>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>With Msys2/Mingw (officialized by NumWorks but with a lot of bugs)</summary>
|
||||||
|
|
||||||
|
[Msys2](https://www.msys2.org/) environment is recommended by NumWorks to get most of the required tools on Windows easily. It's where you'll paste all the commands of this tutorial. Once it'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 terminal and you can go to step 2!
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>With WSL 2</summary>
|
||||||
|
|
||||||
|
You need a Windows version >= 1903.
|
||||||
|
|
||||||
|
#### WSL Installation
|
||||||
|
|
||||||
|
1. Use simultaneously Win + X keys and then click on "admin powershell".
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
|
||||||
|
```
|
||||||
|
|
||||||
|
This command activate WSL functionalities.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
|
||||||
|
```
|
||||||
|
|
||||||
|
This one allows virtual machines developed by Microsoft.
|
||||||
|
|
||||||
|
2. Restart your computer.
|
||||||
|
|
||||||
|
3. Download [this file](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi) and follow instructions.
|
||||||
|
|
||||||
|
4. Now open powershell admin like before and type:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
wsl --set-default-version 2
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Download [Ubuntu](https://www.microsoft.com/store/apps/9n6svws3rx71) from Microsoft store.
|
||||||
|
|
||||||
|
WSL is now installed.
|
||||||
|
|
||||||
|
6. Then Install GCC cross compiler for ARM. In your Ubuntu teminal, run:
|
||||||
|
<!-- TODO: Test if `wsl --install` works better, and if WSL2 has not became the
|
||||||
|
default -->
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install build-essential git imagemagick libx11-dev libxext-dev libfreetype6-dev libpng-dev libjpeg-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
|
||||||
|
```
|
||||||
|
|
||||||
|
### Usbipd installation to connect your calculator
|
||||||
|
|
||||||
|
If you want to connect to the calculator, you have to connect to install this
|
||||||
|
[tool](https://github.com/dorssel/usbipd-win/releases/download/v5.0.0/usbipd-win_5.0.0_x64.msi).
|
||||||
|
This will allow you to connect WSL to the calculator through internet. Follow
|
||||||
|
the on screen information to install.
|
||||||
|
|
||||||
|
#### Ubuntu
|
||||||
|
|
||||||
|
1. In a WSL Ubuntu command prompt, type:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install linux-tools-generic hwdata
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- 2. Edit /etc/sudoers so that root can find the usbip command. On Ubuntu, run this command.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo visudo
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Add `/usr/lib/linux-tools/5.4.0-77-generic` to the beginning of secure_path. After editing, the line should look similar to this.
|
||||||
|
`Defaults secure_path="/usr/lib/linux-tools/5.4.0-77-generic:/usr/local/sbin:..."` -->
|
||||||
|
|
||||||
|
#### Debian
|
||||||
|
|
||||||
|
1. If you use Debian for your WSL distro, use this command instead:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install usbip hwdata usbutils
|
||||||
|
```
|
||||||
|
|
||||||
|
And that's all for installation and set up.
|
||||||
|
|
||||||
|
### To connect your calculator
|
||||||
|
|
||||||
|
1. Open an admin PowerShell and type:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
usbipd list
|
||||||
|
```
|
||||||
|
|
||||||
|
This will list your USB devices connected. Look at the BUSID column and remember the one for your calculator (it should be called "Numworks Calculator").
|
||||||
|
2. Now run this command replacing `<BUSID>` by your calculator's USB port id:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
usbipd bind --busid <BUSID>
|
||||||
|
usbipd attach --wsl --busid <BUSID>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
It will ask you to type your WSL's password and will connect your calculator to WSL.
|
||||||
|
|
||||||
|
You can now go to step 2!
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
</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/UpsilonNumworks/Upsilon.git
|
||||||
|
cd Upsilon
|
||||||
|
git checkout upsilon-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
### 3. Choose the target
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary><b>Model n0100</b></summary>
|
||||||
|
|
||||||
(note: you can change the `EPSILON_I18N=en` flag to `fr`, `nl`, `pt`, `it`, `de`, `es` or `hu`).
|
(note: you can change the `EPSILON_I18N=en` flag to `fr`, `nl`, `pt`, `it`, `de`, `es` or `hu`).
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone --recursive https://github.com/Omega-Numworks/Omega.git
|
|
||||||
cd Omega
|
|
||||||
git checkout omega-master
|
|
||||||
make MODEL=n0100 clean
|
make MODEL=n0100 clean
|
||||||
make MODEL=n0100 EPSILON_I18N=en OMEGA_USERNAME="{Your name, max 15 characters}" -j4
|
make MODEL=n0100 EPSILON_I18N=en OMEGA_USERNAME="{Your name, max 15 characters}" -j$(nproc)
|
||||||
|
```
|
||||||
|
|
||||||
|
Now, run either:
|
||||||
|
|
||||||
|
```bash
|
||||||
make MODEL=n0100 epsilon_flash
|
make MODEL=n0100 epsilon_flash
|
||||||
```
|
```
|
||||||
|
|
||||||
Important: Don't forget the `--recursive` tag, because Omega relies on submodules.
|
to directly flash the calculator after pressing simultaneously `reset` and `6` buttons and plugging in.
|
||||||
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>
|
<br>
|
||||||
<summary><b>Model n0110</b></summary>
|
|
||||||
|
or:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone --recursive https://github.com/Omega-Numworks/Omega.git
|
make MODEL=n0100 OMEGA_USERNAME="" binpack -j$(nproc)
|
||||||
cd Omega
|
|
||||||
git checkout omega-master
|
|
||||||
make clean
|
|
||||||
make OMEGA_USERNAME="{Your name, max 15 characters}" -j4
|
|
||||||
make epsilon_flash
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Important: Don't forget the `--recursive` tag, because Omega relies on submodules.
|
to make binpack which you can flash to the calculator from [TI-Planet's WebDFU](https://ti-planet.github.io/webdfu_numworks/n0100/). Binpacks are a great way to share a custom build of Upsilon to friends.
|
||||||
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>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><b>Bin files</b></summary>
|
|
||||||
|
<summary><b>Model n0110</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/)).
|
|
||||||
|
The bootloader allows you to install 2 firmwares in separated "slots". If so, external apps won't have all the space but half. Bootloader will allow use of all of the memory if only one slot is flashed. In legacy mode, external apps use all the space available.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Bootloader</summary>
|
||||||
|
|
||||||
|
Your calculator must already have been flashed with [Upsilon](https://getupsilon.web.app)'s or [Omega](https://getomega.dev)'s bootloader.
|
||||||
|
Then, build with:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone --recursive https://github.com/Omega-Numworks/Omega.git
|
|
||||||
cd Omega
|
|
||||||
git checkout omega-master
|
|
||||||
make clean
|
make clean
|
||||||
make MODEL=n0100 OMEGA_USERNAME="" -j8
|
make OMEGA_USERNAME="{Your name, max 15 characters}" -j$(nproc)
|
||||||
make MODEL=n0100 OMEGA_USERNAME="" binpack -j8
|
|
||||||
make OMEGA_USERNAME="" -j8
|
|
||||||
make OMEGA_USERNAME="" binpack -j8
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Important: Don't forget the `--recursive` tag, because Omega relies on submodules.
|
Now, run either:
|
||||||
Also, you can change the number of processes that run in parallel during the build by changing the value of the `-j` flag.
|
|
||||||
|
```bash
|
||||||
|
make epsilon.A_flash
|
||||||
|
```
|
||||||
|
|
||||||
|
to directly flash the calculator into the current slot, or thought bootloader's slot flasher with RESET, then 4 (flash), and 1 (flash slots) for other slots.
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
or:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make OMEGA_USERNAME="" binpack -j$(nproc)
|
||||||
|
```
|
||||||
|
|
||||||
|
to make binpack which you can flash to the calculator from [TI-Planet's webDFU](https://ti-planet.github.io/webdfu_numworks/n0110/). You'll find them at `output/release/device/bootloader/`. Binpacks are a great way to share a custom build of Upsilon to friends.
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><b>Web simulator</b></summary>
|
<summary>Model N0110 legacy (deprecated, use bootloader instead for Epsilon protection)</summary>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make MODEL=n0110 clean
|
||||||
|
make MODEL=n0110 OMEGA_USERNAME="{Your name, max 15 characters}" -j$(nproc)
|
||||||
|
```
|
||||||
|
|
||||||
|
Now, run either:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make MODEL=n0110 epsilon_flash
|
||||||
|
```
|
||||||
|
|
||||||
|
to directly flash the calculator after pressing simultaneously `reset` and `6` buttons and plugging in.
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
or:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make MODEL=n0110 OMEGA_USERNAME="" binpack -j$(nproc)
|
||||||
|
```
|
||||||
|
|
||||||
|
to make binpack which you can flash to the calculator from [Ti-Planet's WebDFU](https://ti-planet.github.io/webdfu_numworks/n0110/). You'll find them at `output/release/device/bootloader/`. Binpacks are a great way to share a custom build of Upsilon to friends.
|
||||||
|
</details>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary><b>Native simulator</b></summary>
|
||||||
|
|
||||||
|
Run this command:
|
||||||
|
```bash
|
||||||
|
make clean
|
||||||
|
```
|
||||||
|
You can either build using the following command that will automatically detect your platform:
|
||||||
|
```bash
|
||||||
|
make PLATFORM=simulator
|
||||||
|
```
|
||||||
|
or, choose the command corresponding to your platform:
|
||||||
|
```bash
|
||||||
|
make PLATFORM=simulator TARGET=android
|
||||||
|
make PLATFORM=simulator TARGET=ios
|
||||||
|
make PLATFORM=simulator TARGET=macos
|
||||||
|
make PLATFORM=simulator TARGET=web
|
||||||
|
make PLATFORM=simulator TARGET=windows
|
||||||
|
make PLATFORM=simulator TARGET=3ds
|
||||||
|
```
|
||||||
|
|
||||||
|
You'll find simulator files in `output/release/simulator/`.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary><b>Web simulator</b></summary>
|
||||||
|
|
||||||
First, install emsdk :
|
First, install emsdk :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/emscripten-core/emsdk.git
|
git clone https://github.com/emscripten-core/emsdk.git
|
||||||
cd emsdk
|
cd emsdk
|
||||||
./emsdk install latest-fastcomp
|
./emsdk install 1.40.1
|
||||||
./emsdk activate latest-fastcomp
|
./emsdk activate 1.40.1
|
||||||
source emsdk_env.sh
|
source emsdk_env.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Then, compile Omega :
|
Then, compile Upsilon :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone --recursive https://github.com/Omega-Numworks/Omega.git
|
|
||||||
cd Omega
|
|
||||||
git checkout omega-master
|
|
||||||
make clean
|
make clean
|
||||||
make PLATFORM=simulator TARGET=web OMEGA_USERNAME="{Your name, max 15 characters}" -j4
|
make PLATFORM=simulator TARGET=web OMEGA_USERNAME="{Your name, max 15 characters}" -j$(nproc)
|
||||||
```
|
```
|
||||||
|
|
||||||
The simulator is now in `output/release/simulator/web/simulator.zip`
|
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>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><b>3DS Simulator</b></summary>
|
|
||||||
|
<summary><b>3DS Simulator</b></summary>
|
||||||
|
|
||||||
You need devkitPro and devkitARM installed and in your path (instructions [here](https://devkitpro.org/wiki/Getting_Started))
|
You need devkitPro and devkitARM installed and in your path (instructions [here](https://devkitpro.org/wiki/Getting_Started))
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone --recursive https://github.com/Omega-Numworks/Omega.git
|
git clone --recursive https://github.com/UpsilonNumworks/Upsilon.git
|
||||||
cd Omega
|
cd Upsilon
|
||||||
git checkout --recursive omega-dev
|
git checkout upsilon-dev
|
||||||
make PLATFORM=simulator TARGET=3ds -j
|
make PLATFORM=simulator TARGET=3ds -j$(nproc)
|
||||||
```
|
```
|
||||||
|
|
||||||
You can then put epsilon.3dsx on a SD card to run it from the HBC or use 3dslink to launch it over the network:
|
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
|
```bash
|
||||||
@@ -140,28 +442,80 @@ You can then put epsilon.3dsx on a SD card to run it from the HBC or use 3dslink
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
If you need help, you can join our Discord server here : https://discord.gg/X2TWhh9
|
<details>
|
||||||
|
|
||||||
|
<summary><b>Android Simulator</b></summary>
|
||||||
|
|
||||||
|
Make sure you have JDK 25 installed.
|
||||||
|
Then, download the Android toolchain r21e as following :
|
||||||
|
```
|
||||||
|
export ANDROID_HOME=$PWD/android-sdk
|
||||||
|
wget -nv https://gitlab.com/fdroid/sdkmanager/-/raw/master/sdkmanager.py
|
||||||
|
python3 sdkmanager.py --licenses
|
||||||
|
python3 sdkmanager.py --install "ndk-bundle;r21e"
|
||||||
|
```
|
||||||
|
All you have to do is run this command to compile Upsilon.
|
||||||
|
```
|
||||||
|
make -j$(nproc) PLATFORM=simulator TARGET=android
|
||||||
|
```
|
||||||
|
The compiled file named `epsilon.apk` will be the one to install on the phone from your file manager. Shoudl work on Android 4.1+.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>Casio fx-CG-series Port</b></summary>
|
||||||
|
|
||||||
|
First, install gint and fxsdk along with a cross compiler for the calculator. There are instructions for this (in French, but Google Translate works well enough) [here](https://www.planet-casio.com/Fr/forums/topic16614-last-giteapc-installer-et-mettre-a-jour-automatiquement-des-projets-gitea.html).
|
||||||
|
|
||||||
|
Next:
|
||||||
|
```bash
|
||||||
|
git clone --recursive https://github.com/UpsilonNumworks/Upsilon.git
|
||||||
|
cd Omega
|
||||||
|
git checkout upsilon-dev
|
||||||
|
make PLATFORM=simulator TARGET=fxcg -j$(nproc)
|
||||||
|
```
|
||||||
|
Then copy the file at `./output/release/simulator/fxcg/epsilon.g3a` to the calculator over USB.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
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>
|
||||||
|
|
||||||
<a href="https://discord.gg/X2TWhh9"><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://upsilonnumworks.github.io/Upsilon-External/)
|
||||||
|
- [Ulab documentation](https://micropython-ulab.readthedocs.io/en/latest/)
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
To contribute, please refer to the [Wiki](https://github.com/Omega-Numworks/Omega/wiki/Contributing)
|
To contribute, please refer to [Omega's Wiki](https://github.com/Omega-Numworks/Omega/wiki/Contributing), the same rules apply here.
|
||||||
|
|
||||||
## Related repositories
|
## Related repositories
|
||||||
|
|
||||||
* [Omega Themes](https://github.com/Omega-Numworks/Omega-Themes)
|
Here are the main links toward Omega's different websites and repositories, that have been used for the creation of Upsilon.
|
||||||
* [Omega Website](https://github.com/Omega-Numworks/Omega-Website)
|
|
||||||
* [Omega RPN `APP`](https://github.com/Omega-Numworks/Omega-RPN)
|
- [Omega Themes](https://github.com/Omega-Numworks/Omega-Themes)
|
||||||
* [Omega Atomic `APP`](https://github.com/Omega-Numworks/Omega-Atomic)
|
- [Omega Website](https://github.com/Omega-Numworks/Omega-Website)
|
||||||
* [Omega Design](https://github.com/Omega-Numworks/Omega-Design)
|
- [Omega RPN `APP`](https://github.com/Omega-Numworks/Omega-RPN)
|
||||||
* [Omega Discord Bot](https://github.com/Omega-Numworks/Omega-Discord-Bot)
|
- [Omega Atomic `APP`](https://github.com/Omega-Numworks/Omega-Atomic)
|
||||||
* [Omega App Template `BETA`](https://github.com/Omega-Numworks/Omega-App-Template)
|
- [Omega Design](https://github.com/Omega-Numworks/Omega-Design)
|
||||||
* [External Apps](https://github.com/Omega-Numworks/External-Apps)
|
- [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)
|
||||||
|
|
||||||
## About Epsilon
|
## About Epsilon
|
||||||
|
|
||||||
|
Upsilon is a fork of Omega, after the project's discontinuation.
|
||||||
|
|
||||||
Omega is a fork of Epsilon, 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/).
|
You can try Epsilon straight from your browser in the [online simulator](https://www.numworks.com/simulator/).
|
||||||
@@ -170,7 +524,9 @@ You can try Epsilon straight from your browser in the [online simulator](https:/
|
|||||||
|
|
||||||
NumWorks is a registered trademark of NumWorks SAS, 24 Rue Godot de Mauroy, 75009 Paris, France.
|
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.
|
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.
|
Casio is a registered trademark of Casio Computer Co., Ltd. CORPORATION JAPAN 6-2, Hon-machi 1-chome Shibuya-ku, Tokyo JAPAN 151-8543.
|
||||||
|
NumWorks SAS, Nintendo of America Inc and Casio 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).
|
- 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).
|
- 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).
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ ifneq ($(strip $(apps_missing)),)
|
|||||||
$(foreach i, $(SUBMODULES_APPS), $(if $(call app_equals, $(filter $(i), $(apps_missing)), $(i)), $(eval miss_modules=1)))
|
$(foreach i, $(SUBMODULES_APPS), $(if $(call app_equals, $(filter $(i), $(apps_missing)), $(i)), $(eval miss_modules=1)))
|
||||||
|
|
||||||
ifeq ($(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 "\nSome submodules apps seem to be missing. To download them, assuming you git clone'd the repo, do\n")
|
||||||
PLS_IGNORE := $(shell >&2 printf " git submodule init\n")
|
PLS_IGNORE := $(shell >&2 printf " git submodule init\n")
|
||||||
PLS_IGNORE := $(shell >&2 printf " git submodule update\n\n")
|
PLS_IGNORE := $(shell >&2 printf " git submodule update\n\n")
|
||||||
endif
|
endif
|
||||||
@@ -50,6 +50,7 @@ apps_src += $(addprefix apps/,\
|
|||||||
exam_mode_configuration_official.cpp:+official \
|
exam_mode_configuration_official.cpp:+official \
|
||||||
exam_mode_configuration_non_official.cpp:-official \
|
exam_mode_configuration_non_official.cpp:-official \
|
||||||
global_preferences.cpp \
|
global_preferences.cpp \
|
||||||
|
host_filemanager.cpp \
|
||||||
i18n.py \
|
i18n.py \
|
||||||
lock_view.cpp \
|
lock_view.cpp \
|
||||||
main.cpp \
|
main.cpp \
|
||||||
@@ -58,7 +59,9 @@ apps_src += $(addprefix apps/,\
|
|||||||
math_variable_box_empty_controller.cpp \
|
math_variable_box_empty_controller.cpp \
|
||||||
shift_alpha_lock_view.cpp \
|
shift_alpha_lock_view.cpp \
|
||||||
suspend_timer.cpp \
|
suspend_timer.cpp \
|
||||||
|
timer_manager.cpp \
|
||||||
title_bar_view.cpp \
|
title_bar_view.cpp \
|
||||||
|
xnt_loop.cpp \
|
||||||
)
|
)
|
||||||
|
|
||||||
tests_src += $(addprefix apps/,\
|
tests_src += $(addprefix apps/,\
|
||||||
@@ -81,13 +84,10 @@ $(call object_for,apps/apps_container_storage.cpp apps/apps_container.cpp apps/m
|
|||||||
country_preferences = apps/country_preferences.csv
|
country_preferences = apps/country_preferences.csv
|
||||||
language_preferences = apps/language_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
|
# The header is referred to as <apps/i18n.h> so make sure it's findable this way
|
||||||
SFLAGS += -I$(BUILD_DIR)
|
SFLAGS += -I$(BUILD_DIR)
|
||||||
|
|
||||||
i18n_files += $(addprefix apps/language_,$(addsuffix .universal.i18n, $(EPSILON_I18N)))
|
i18n_files += $(addprefix apps/language_,$(addsuffix .universal.i18n, $(EPSILON_I18N)))
|
||||||
ifeq ($(EPSILON_GETOPT),1)
|
|
||||||
i18n_files += $(addprefix apps/language_,$(addsuffix _iso6391.universal.i18n, $(EPSILON_I18N)))
|
|
||||||
endif
|
|
||||||
|
|
||||||
i18n_files += $(call i18n_with_universal_for,shared)
|
i18n_files += $(call i18n_with_universal_for,shared)
|
||||||
i18n_files += $(call i18n_with_universal_for,toolbox)
|
i18n_files += $(call i18n_with_universal_for,toolbox)
|
||||||
@@ -97,7 +97,7 @@ $(eval $(call rule_for, \
|
|||||||
I18N, \
|
I18N, \
|
||||||
apps/i18n.cpp, \
|
apps/i18n.cpp, \
|
||||||
$(i18n_files), \
|
$(i18n_files), \
|
||||||
$$(PYTHON) apps/i18n.py --codepoints $(code_points) --countrypreferences $(country_preferences) --languagepreferences $(language_preferences) --header $$(subst .cpp,.h,$$@) --implementation $$@ --locales $$(EPSILON_I18N) --countries $$(EPSILON_COUNTRIES) --files $$^ --generateISO6391locales $$(EPSILON_GETOPT), \
|
$$(PYTHON) apps/i18n.py --codepoints $(code_points) --countrypreferences $(country_preferences) --languagepreferences $(language_preferences) --header $$(subst .cpp,.h,$$@) --implementation $$@ --locales $$(EPSILON_I18N) --countries $$(EPSILON_COUNTRIES) --files $$^, \
|
||||||
global \
|
global \
|
||||||
))
|
))
|
||||||
|
|
||||||
@@ -113,11 +113,14 @@ $(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)/apps/home/apps_layout.h
|
||||||
$(call object_for,$(apps_src) $(tests_src)): $(BUILD_DIR)/python/port/genhdr/qstrdefs.generated.h
|
$(call object_for,$(apps_src) $(tests_src)): $(BUILD_DIR)/python/port/genhdr/qstrdefs.generated.h
|
||||||
|
|
||||||
|
$(call object_for,$(apps_src)): $(BUILD_DIR)/apps/home/apps_layout.h
|
||||||
|
|
||||||
apps_tests_src = $(app_calculation_test_src) $(app_code_test_src) $(app_graph_test_src) $(app_probability_test_src) $(app_regression_test_src) $(app_sequence_test_src) $(app_shared_test_src) $(app_statistics_test_src) $(app_settings_test_src) $(app_solver_test_src)
|
apps_tests_src = $(app_calculation_test_src) $(app_code_test_src) $(app_graph_test_src) $(app_probability_test_src) $(app_regression_test_src) $(app_sequence_test_src) $(app_shared_test_src) $(app_statistics_test_src) $(app_settings_test_src) $(app_solver_test_src)
|
||||||
|
|
||||||
apps_tests_src += $(addprefix apps/,\
|
apps_tests_src += $(addprefix apps/,\
|
||||||
alternate_empty_nested_menu_controller.cpp \
|
alternate_empty_nested_menu_controller.cpp \
|
||||||
global_preferences.cpp \
|
global_preferences.cpp \
|
||||||
|
dummy_timer_manager.cpp \
|
||||||
)
|
)
|
||||||
|
|
||||||
ifeq ($(THEME_REPO),local)
|
ifeq ($(THEME_REPO),local)
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ AppsContainer::AppsContainer() :
|
|||||||
m_globalContext(),
|
m_globalContext(),
|
||||||
m_variableBoxController(),
|
m_variableBoxController(),
|
||||||
m_examPopUpController(this),
|
m_examPopUpController(this),
|
||||||
m_promptController(k_promptMessages, k_promptColors, k_promptNumberOfMessages),
|
m_promptController(k_promptMessages, k_promptFGColors, k_promptBGColors, k_promptNumberOfMessages),
|
||||||
m_batteryTimer(),
|
m_batteryTimer(),
|
||||||
m_suspendTimer(),
|
m_suspendTimer(),
|
||||||
m_backlightDimmingTimer(),
|
m_backlightDimmingTimer(),
|
||||||
@@ -37,7 +37,8 @@ AppsContainer::AppsContainer() :
|
|||||||
m_homeSnapshot(),
|
m_homeSnapshot(),
|
||||||
m_onBoardingSnapshot(),
|
m_onBoardingSnapshot(),
|
||||||
m_hardwareTestSnapshot(),
|
m_hardwareTestSnapshot(),
|
||||||
m_usbConnectedSnapshot()
|
m_usbConnectedSnapshot(),
|
||||||
|
m_startAppSnapshot()
|
||||||
{
|
{
|
||||||
m_emptyBatteryWindow.setFrame(KDRect(0, 0, Ion::Display::Width, Ion::Display::Height), false);
|
m_emptyBatteryWindow.setFrame(KDRect(0, 0, Ion::Display::Width, Ion::Display::Height), false);
|
||||||
// #if __EMSCRIPTEN__
|
// #if __EMSCRIPTEN__
|
||||||
@@ -47,7 +48,7 @@ AppsContainer::AppsContainer() :
|
|||||||
* poincareCircuitBreaker is run. This means either whitelisting all Epsilon
|
* poincareCircuitBreaker is run. This means either whitelisting all Epsilon
|
||||||
* (which makes bigger files to download and slower execution), or
|
* (which makes bigger files to download and slower execution), or
|
||||||
* whitelisting all the symbols (that's a big amount of symbols to find and
|
* whitelisting all the symbols (that's a big amount of symbols to find and
|
||||||
* quite painy to maintain).
|
* quite paint to maintain).
|
||||||
* We just remove the circuit breaker for now.
|
* We just remove the circuit breaker for now.
|
||||||
* TODO: Put the Poincare circuit breaker back on epsilon's web emulator */
|
* TODO: Put the Poincare circuit breaker back on epsilon's web emulator */
|
||||||
|
|
||||||
@@ -58,6 +59,11 @@ AppsContainer::AppsContainer() :
|
|||||||
Poincare::Expression::SetCircuitBreaker(AppsContainer::poincareCircuitBreaker);
|
Poincare::Expression::SetCircuitBreaker(AppsContainer::poincareCircuitBreaker);
|
||||||
// #endif
|
// #endif
|
||||||
Ion::Storage::sharedStorage()->setDelegate(this);
|
Ion::Storage::sharedStorage()->setDelegate(this);
|
||||||
|
|
||||||
|
addTimer(&m_batteryTimer);
|
||||||
|
addTimer(&m_suspendTimer);
|
||||||
|
addTimer(&m_backlightDimmingTimer);
|
||||||
|
addTimer(&m_clockTimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AppsContainer::poincareCircuitBreaker() {
|
bool AppsContainer::poincareCircuitBreaker() {
|
||||||
@@ -146,8 +152,11 @@ bool AppsContainer::dispatchEvent(Ion::Events::Event event) {
|
|||||||
* We do it before switching to USB application to redraw the battery
|
* We do it before switching to USB application to redraw the battery
|
||||||
* pictogram. */
|
* pictogram. */
|
||||||
updateBatteryState();
|
updateBatteryState();
|
||||||
if (switchTo(usbConnectedAppSnapshot())) {
|
if (GlobalPreferences::sharedGlobalPreferences()->isInExamMode()) {
|
||||||
Ion::USB::DFU();
|
// If we are in exam mode, we don't switch to usb connected app
|
||||||
|
didProcessEvent = true;
|
||||||
|
} else if (switchTo(usbConnectedAppSnapshot())) {
|
||||||
|
Ion::USB::DFU(true);
|
||||||
// Update LED when exiting DFU mode
|
// Update LED when exiting DFU mode
|
||||||
Ion::LED::updateColorWithPlugAndCharge();
|
Ion::LED::updateColorWithPlugAndCharge();
|
||||||
bool switched = switchTo(activeSnapshot);
|
bool switched = switchTo(activeSnapshot);
|
||||||
@@ -220,6 +229,7 @@ bool AppsContainer::dispatchEvent(Ion::Events::Event event) {
|
|||||||
return didProcessEvent || alphaLockWantsRedraw;
|
return didProcessEvent || alphaLockWantsRedraw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// List of keys that are used to switch between apps, in order of app to go (eg. 0 : First App, 1 : Second App, 2 : Third App, ...)
|
||||||
static constexpr Ion::Events::Event switch_events[] = {
|
static constexpr Ion::Events::Event switch_events[] = {
|
||||||
Ion::Events::ShiftSeven, Ion::Events::ShiftEight, Ion::Events::ShiftNine,
|
Ion::Events::ShiftSeven, Ion::Events::ShiftEight, Ion::Events::ShiftNine,
|
||||||
Ion::Events::ShiftFour, Ion::Events::ShiftFive, Ion::Events::ShiftSix,
|
Ion::Events::ShiftFour, Ion::Events::ShiftFive, Ion::Events::ShiftSix,
|
||||||
@@ -231,27 +241,33 @@ bool AppsContainer::processEvent(Ion::Events::Event event) {
|
|||||||
// Warning: if the window is dirtied, you need to call window()->redraw()
|
// Warning: if the window is dirtied, you need to call window()->redraw()
|
||||||
if (event == Ion::Events::USBPlug) {
|
if (event == Ion::Events::USBPlug) {
|
||||||
if (Ion::USB::isPlugged()) {
|
if (Ion::USB::isPlugged()) {
|
||||||
|
// If the exam mode is enabled, we ask to disable it, else, we enable USB
|
||||||
if (GlobalPreferences::sharedGlobalPreferences()->isInExamMode()) {
|
if (GlobalPreferences::sharedGlobalPreferences()->isInExamMode()) {
|
||||||
displayExamModePopUp(GlobalPreferences::ExamMode::Off);
|
displayExamModePopUp(GlobalPreferences::ExamMode::Off);
|
||||||
window()->redraw();
|
window()->redraw();
|
||||||
} else {
|
} else {
|
||||||
Ion::USB::enable();
|
Ion::USB::enable();
|
||||||
}
|
}
|
||||||
|
// Update brightness when USB is plugged
|
||||||
Ion::Backlight::setBrightness(GlobalPreferences::sharedGlobalPreferences()->brightnessLevel());
|
Ion::Backlight::setBrightness(GlobalPreferences::sharedGlobalPreferences()->brightnessLevel());
|
||||||
} else {
|
} else {
|
||||||
|
// If the USB isn't plugged in USBPlug event, we disable USB
|
||||||
Ion::USB::disable();
|
Ion::USB::disable();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
// If key home or key back is pressed, we switch to the home app.
|
||||||
if (event == Ion::Events::Home || event == Ion::Events::Back) {
|
if (event == Ion::Events::Home || event == Ion::Events::Back) {
|
||||||
switchTo(appSnapshotAtIndex(0));
|
switchTo(appSnapshotAtIndex(0));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
// If shift + Home are pressed, we switch to the first app.
|
||||||
if (event == Ion::Events::ShiftHome) {
|
if (event == Ion::Events::ShiftHome) {
|
||||||
switchTo(appSnapshotAtIndex(1));
|
switchTo(appSnapshotAtIndex(1));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Iterate through the switch events to find the one that matches the event, if one match, switch to the app at the index of the switch event.
|
||||||
for(int i = 0; i < std::min((int) (sizeof(switch_events) / sizeof(Ion::Events::Event)), APPS_CONTAINER_SNAPSHOT_COUNT); i++) {
|
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]) {
|
if (event == switch_events[i]) {
|
||||||
m_window.redraw(true);
|
m_window.redraw(true);
|
||||||
@@ -260,19 +276,44 @@ bool AppsContainer::processEvent(Ion::Events::Event event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add EE shortcut to go to the settings (app number 12)
|
||||||
|
if (event == Ion::Events::EE) {
|
||||||
|
switchTo(appSnapshotAtIndex(12));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add Shift + Ans shortcut to go to the previous app
|
||||||
|
if (event == Ion::Events::ShiftAns) {
|
||||||
|
switchTo(appSnapshotAtIndex(m_lastAppIndex));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the event is the OnOff key, we suspend the calculator.
|
||||||
if (event == Ion::Events::OnOff) {
|
if (event == Ion::Events::OnOff) {
|
||||||
suspend(true);
|
suspend(true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
// If the event is a brightness event, we update the brightness according to the event.
|
||||||
if (event == Ion::Events::BrightnessPlus || event == Ion::Events::BrightnessMinus) {
|
if (event == Ion::Events::BrightnessPlus || event == Ion::Events::BrightnessMinus) {
|
||||||
int delta = Ion::Backlight::MaxBrightness/GlobalPreferences::NumberOfBrightnessStates;
|
int delta = Ion::Backlight::MaxBrightness/GlobalPreferences::NumberOfBrightnessStates;
|
||||||
int direction = (event == Ion::Events::BrightnessPlus) ? Ion::Backlight::NumberOfStepsPerShortcut*delta : -delta*Ion::Backlight::NumberOfStepsPerShortcut;
|
int NumberOfStepsPerShortcut = GlobalPreferences::sharedGlobalPreferences()->brightnessShortcut();
|
||||||
|
int direction = (event == Ion::Events::BrightnessPlus) ? NumberOfStepsPerShortcut*delta : -delta*NumberOfStepsPerShortcut;
|
||||||
GlobalPreferences::sharedGlobalPreferences()->setBrightnessLevel(GlobalPreferences::sharedGlobalPreferences()->brightnessLevel()+direction);
|
GlobalPreferences::sharedGlobalPreferences()->setBrightnessLevel(GlobalPreferences::sharedGlobalPreferences()->brightnessLevel()+direction);
|
||||||
}
|
}
|
||||||
|
// Else, the event was not processed.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AppsContainer::switchTo(App::Snapshot * snapshot) {
|
bool AppsContainer::switchTo(App::Snapshot * snapshot) {
|
||||||
|
// Get app index of the snapshot
|
||||||
|
int m_appIndexToSwitch = appIndexFromSnapshot(snapshot);
|
||||||
|
// If the app is home, skip app index saving
|
||||||
|
if (m_appIndexToSwitch != 0) {
|
||||||
|
// Save last app index
|
||||||
|
m_lastAppIndex = m_currentAppIndex;
|
||||||
|
// Save current app index
|
||||||
|
m_currentAppIndex = m_appIndexToSwitch;
|
||||||
|
}
|
||||||
if (s_activeApp && snapshot != s_activeApp->snapshot()) {
|
if (s_activeApp && snapshot != s_activeApp->snapshot()) {
|
||||||
resetShiftAlphaStatus();
|
resetShiftAlphaStatus();
|
||||||
}
|
}
|
||||||
@@ -309,7 +350,13 @@ void AppsContainer::run() {
|
|||||||
/* Normal execution. The exception checkpoint must be created before
|
/* Normal execution. The exception checkpoint must be created before
|
||||||
* switching to the first app, because the first app might create nodes on
|
* switching to the first app, because the first app might create nodes on
|
||||||
* the pool. */
|
* the pool. */
|
||||||
bool switched = switchTo(initialAppSnapshot());
|
bool switched;
|
||||||
|
if (m_startAppSnapshot != nullptr) {
|
||||||
|
switched = switchTo(m_startAppSnapshot);
|
||||||
|
} else {
|
||||||
|
switched = switchTo(initialAppSnapshot());
|
||||||
|
}
|
||||||
|
|
||||||
assert(switched);
|
assert(switched);
|
||||||
(void) switched; // Silence compilation warning about unused variable.
|
(void) switched; // Silence compilation warning about unused variable.
|
||||||
} else {
|
} else {
|
||||||
@@ -319,7 +366,7 @@ void AppsContainer::run() {
|
|||||||
* destroyed from the pool. To avoid using them before packing the app
|
* destroyed from the pool. To avoid using them before packing the app
|
||||||
* (in App::willBecomeInactive for instance), we tidy them early on. */
|
* (in App::willBecomeInactive for instance), we tidy them early on. */
|
||||||
s_activeApp->snapshot()->tidy();
|
s_activeApp->snapshot()->tidy();
|
||||||
/* When an app encoutered an exception due to a full pool, the next time
|
/* When an app encountered an exception due to a full pool, the next time
|
||||||
* the user enters the app, the same exception could happen again which
|
* the user enters the app, the same exception could happen again which
|
||||||
* would prevent from reopening the app. To avoid being stuck outside the
|
* would prevent from reopening the app. To avoid being stuck outside the
|
||||||
* app causing the issue, we reset its snapshot when leaving it due to
|
* app causing the issue, we reset its snapshot when leaving it due to
|
||||||
@@ -353,6 +400,8 @@ bool AppsContainer::updateBatteryState() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AppsContainer::refreshPreferences() {
|
void AppsContainer::refreshPreferences() {
|
||||||
|
m_suspendTimer.reset(GlobalPreferences::sharedGlobalPreferences()->idleBeforeSuspendSeconds()*1000/Timer::TickDuration);
|
||||||
|
m_backlightDimmingTimer.reset(GlobalPreferences::sharedGlobalPreferences()->idleBeforeDimmingSeconds()*1000/Timer::TickDuration);
|
||||||
m_window.refreshPreferences();
|
m_window.refreshPreferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -446,15 +495,6 @@ Window * AppsContainer::window() {
|
|||||||
return &m_window;
|
return &m_window;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AppsContainer::numberOfContainerTimers() {
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
Timer * AppsContainer::containerTimerAtIndex(int i) {
|
|
||||||
Timer * timers[4] = {&m_batteryTimer, &m_suspendTimer, &m_backlightDimmingTimer, &m_clockTimer};
|
|
||||||
return timers[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
void AppsContainer::resetShiftAlphaStatus() {
|
void AppsContainer::resetShiftAlphaStatus() {
|
||||||
Ion::Events::setShiftAlphaStatus(Ion::Events::ShiftAlphaStatus::Default);
|
Ion::Events::setShiftAlphaStatus(Ion::Events::ShiftAlphaStatus::Default);
|
||||||
updateAlphaLock();
|
updateAlphaLock();
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#include "shared/global_context.h"
|
#include "shared/global_context.h"
|
||||||
#include "clock_timer.h"
|
#include "clock_timer.h"
|
||||||
#include "on_boarding/prompt_controller.h"
|
#include "on_boarding/prompt_controller.h"
|
||||||
|
#include "xnt_loop.h"
|
||||||
|
|
||||||
#include <ion/events.h>
|
#include <ion/events.h>
|
||||||
|
|
||||||
@@ -28,6 +29,7 @@ public:
|
|||||||
static bool poincareCircuitBreaker();
|
static bool poincareCircuitBreaker();
|
||||||
virtual int numberOfApps() = 0;
|
virtual int numberOfApps() = 0;
|
||||||
virtual App::Snapshot * appSnapshotAtIndex(int index) = 0;
|
virtual App::Snapshot * appSnapshotAtIndex(int index) = 0;
|
||||||
|
virtual int appIndexFromSnapshot(App::Snapshot * snapshot) = 0;
|
||||||
App::Snapshot * initialAppSnapshot();
|
App::Snapshot * initialAppSnapshot();
|
||||||
App::Snapshot * hardwareTestAppSnapshot();
|
App::Snapshot * hardwareTestAppSnapshot();
|
||||||
App::Snapshot * onBoardingAppSnapshot();
|
App::Snapshot * onBoardingAppSnapshot();
|
||||||
@@ -47,6 +49,8 @@ public:
|
|||||||
void displayExamModePopUp(GlobalPreferences::ExamMode mode);
|
void displayExamModePopUp(GlobalPreferences::ExamMode mode);
|
||||||
void shutdownDueToLowBattery();
|
void shutdownDueToLowBattery();
|
||||||
void setShiftAlphaStatus(Ion::Events::ShiftAlphaStatus newStatus);
|
void setShiftAlphaStatus(Ion::Events::ShiftAlphaStatus newStatus);
|
||||||
|
CodePoint XNT(CodePoint defaultXNT, bool * shouldRemoveLastCharacter) { return m_XNTLoop.XNT(defaultXNT, shouldRemoveLastCharacter); }
|
||||||
|
void resetXNT() { m_XNTLoop.reset(); }
|
||||||
OnBoarding::PromptController * promptController();
|
OnBoarding::PromptController * promptController();
|
||||||
void redrawWindow(bool force = false);
|
void redrawWindow(bool force = false);
|
||||||
void activateExamMode(GlobalPreferences::ExamMode examMode);
|
void activateExamMode(GlobalPreferences::ExamMode examMode);
|
||||||
@@ -55,19 +59,23 @@ public:
|
|||||||
// Ion::StorageDelegate
|
// Ion::StorageDelegate
|
||||||
void storageDidChangeForRecord(const Ion::Storage::Record record) override;
|
void storageDidChangeForRecord(const Ion::Storage::Record record) override;
|
||||||
void storageIsFull() override;
|
void storageIsFull() override;
|
||||||
|
#ifdef EPSILON_GETOPT
|
||||||
|
void setStartApp(App::Snapshot * snapshot) { m_startAppSnapshot = snapshot; }
|
||||||
|
#endif
|
||||||
protected:
|
protected:
|
||||||
Home::App::Snapshot * homeAppSnapshot() { return &m_homeSnapshot; }
|
Home::App::Snapshot * homeAppSnapshot() { return &m_homeSnapshot; }
|
||||||
private:
|
private:
|
||||||
Window * window() override;
|
Window * window() override;
|
||||||
int numberOfContainerTimers() override;
|
|
||||||
Timer * containerTimerAtIndex(int i) override;
|
|
||||||
bool processEvent(Ion::Events::Event event);
|
bool processEvent(Ion::Events::Event event);
|
||||||
void resetShiftAlphaStatus();
|
void resetShiftAlphaStatus();
|
||||||
bool updateAlphaLock();
|
bool updateAlphaLock();
|
||||||
|
|
||||||
static I18n::Message k_promptMessages[];
|
static I18n::Message k_promptMessages[];
|
||||||
static KDColor k_promptColors[];
|
static KDColor k_promptFGColors[];
|
||||||
|
static KDColor k_promptBGColors[];
|
||||||
static int k_promptNumberOfMessages;
|
static int k_promptNumberOfMessages;
|
||||||
|
int m_currentAppIndex; // Home isn't included after the second app switching
|
||||||
|
int m_lastAppIndex;
|
||||||
AppsWindow m_window;
|
AppsWindow m_window;
|
||||||
EmptyBatteryWindow m_emptyBatteryWindow;
|
EmptyBatteryWindow m_emptyBatteryWindow;
|
||||||
Shared::GlobalContext m_globalContext;
|
Shared::GlobalContext m_globalContext;
|
||||||
@@ -83,6 +91,10 @@ private:
|
|||||||
OnBoarding::App::Snapshot m_onBoardingSnapshot;
|
OnBoarding::App::Snapshot m_onBoardingSnapshot;
|
||||||
HardwareTest::App::Snapshot m_hardwareTestSnapshot;
|
HardwareTest::App::Snapshot m_hardwareTestSnapshot;
|
||||||
USB::App::Snapshot m_usbConnectedSnapshot;
|
USB::App::Snapshot m_usbConnectedSnapshot;
|
||||||
|
XNTLoop m_XNTLoop;
|
||||||
|
#ifdef EPSILON_GETOPT
|
||||||
|
App::Snapshot * m_startAppSnapshot;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ I18n::Message AppsContainer::k_promptMessages[] = {
|
|||||||
I18n::Message::BetaVersionMessage5,
|
I18n::Message::BetaVersionMessage5,
|
||||||
I18n::Message::BetaVersionMessage6};
|
I18n::Message::BetaVersionMessage6};
|
||||||
|
|
||||||
KDColor AppsContainer::k_promptColors[] = {
|
KDColor AppsContainer::k_promptFGColors[] = {
|
||||||
KDColorBlack,
|
KDColorBlack,
|
||||||
KDColorBlack,
|
KDColorBlack,
|
||||||
KDColorBlack,
|
KDColorBlack,
|
||||||
@@ -20,4 +20,14 @@ KDColor AppsContainer::k_promptColors[] = {
|
|||||||
KDColorBlack,
|
KDColorBlack,
|
||||||
Palette::AccentText};
|
Palette::AccentText};
|
||||||
|
|
||||||
|
KDColor AppsContainer::k_promptBGColors[] = {
|
||||||
|
KDColorWhite,
|
||||||
|
KDColorWhite,
|
||||||
|
KDColorWhite,
|
||||||
|
KDColorWhite,
|
||||||
|
KDColorWhite,
|
||||||
|
KDColorWhite,
|
||||||
|
KDColorWhite,
|
||||||
|
KDColorWhite};
|
||||||
|
|
||||||
int AppsContainer::k_promptNumberOfMessages = 8;
|
int AppsContainer::k_promptNumberOfMessages = 8;
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
I18n::Message AppsContainer::k_promptMessages[] = {};
|
I18n::Message AppsContainer::k_promptMessages[] = {};
|
||||||
|
|
||||||
KDColor AppsContainer::k_promptColors[] = {};
|
KDColor AppsContainer::k_promptFGColors[] = {};
|
||||||
|
KDColor AppsContainer::k_promptBGColors[] = {};
|
||||||
|
|
||||||
int AppsContainer::k_promptNumberOfMessages = 0;
|
int AppsContainer::k_promptNumberOfMessages = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ I18n::Message AppsContainer::k_promptMessages[] = {
|
|||||||
I18n::Message::UpdateMessage3,
|
I18n::Message::UpdateMessage3,
|
||||||
I18n::Message::UpdateMessage4};
|
I18n::Message::UpdateMessage4};
|
||||||
|
|
||||||
KDColor AppsContainer::k_promptColors[] = {
|
KDColor AppsContainer::k_promptFGColors[] = {
|
||||||
KDColorBlack,
|
KDColorBlack,
|
||||||
KDColorBlack,
|
KDColorBlack,
|
||||||
KDColorBlack,
|
KDColorBlack,
|
||||||
@@ -16,4 +16,12 @@ KDColor AppsContainer::k_promptColors[] = {
|
|||||||
KDColorBlack,
|
KDColorBlack,
|
||||||
Palette::AccentText};
|
Palette::AccentText};
|
||||||
|
|
||||||
|
KDColor AppsContainer::k_promptBGColors[] = {
|
||||||
|
KDColorWhite,
|
||||||
|
KDColorWhite,
|
||||||
|
KDColorWhite,
|
||||||
|
KDColorBlack,
|
||||||
|
KDColorWhite,
|
||||||
|
KDColorBlack};
|
||||||
|
|
||||||
int AppsContainer::k_promptNumberOfMessages = 6;
|
int AppsContainer::k_promptNumberOfMessages = 6;
|
||||||
|
|||||||
@@ -34,5 +34,25 @@ App::Snapshot * AppsContainerStorage::appSnapshotAtIndex(int index) {
|
|||||||
};
|
};
|
||||||
assert(sizeof(snapshots)/sizeof(snapshots[0]) == k_numberOfCommonApps);
|
assert(sizeof(snapshots)/sizeof(snapshots[0]) == k_numberOfCommonApps);
|
||||||
assert(index >= 0 && index < k_numberOfCommonApps);
|
assert(index >= 0 && index < k_numberOfCommonApps);
|
||||||
|
// To avoid crashes, we return the home app snapshot if the index is out of
|
||||||
|
// bounds. (no crash in release mode, but an assert in debug mode)
|
||||||
|
if (index >= k_numberOfCommonApps) {
|
||||||
|
return snapshots[0];
|
||||||
|
}
|
||||||
return snapshots[index];
|
return snapshots[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the index of the app from its snapshot
|
||||||
|
int AppsContainerStorage::appIndexFromSnapshot(App::Snapshot * snapshot) {
|
||||||
|
App::Snapshot * snapshots[] = {
|
||||||
|
homeAppSnapshot()
|
||||||
|
APPS_CONTAINER_SNAPSHOT_LIST
|
||||||
|
};
|
||||||
|
assert(sizeof(snapshots)/sizeof(snapshots[0]) == k_numberOfCommonApps);
|
||||||
|
for (int i = 0; i < k_numberOfCommonApps; i++) {
|
||||||
|
if (snapshots[i] == snapshot) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ public:
|
|||||||
AppsContainerStorage();
|
AppsContainerStorage();
|
||||||
int numberOfApps() override;
|
int numberOfApps() override;
|
||||||
App::Snapshot * appSnapshotAtIndex(int index) override;
|
App::Snapshot * appSnapshotAtIndex(int index) override;
|
||||||
|
int appIndexFromSnapshot(App::Snapshot * snapshot) override;
|
||||||
void * currentAppBuffer() override { return &m_apps; };
|
void * currentAppBuffer() override { return &m_apps; };
|
||||||
private:
|
private:
|
||||||
union Apps {
|
union Apps {
|
||||||
|
|||||||
Submodule apps/atomic updated: 64f2e38ed1...5f7063d447
@@ -1,11 +1,26 @@
|
|||||||
#include "backlight_dimming_timer.h"
|
#include "backlight_dimming_timer.h"
|
||||||
|
#include "global_preferences.h"
|
||||||
|
#include <ion/backlight.h>
|
||||||
|
#include <ion/events.h>
|
||||||
|
#include <apps/apps_container.h>
|
||||||
|
|
||||||
BacklightDimmingTimer::BacklightDimmingTimer() :
|
BacklightDimmingTimer::BacklightDimmingTimer() :
|
||||||
Timer(k_idleBeforeDimmingDuration/Timer::TickDuration)
|
Timer(GlobalPreferences::sharedGlobalPreferences()->idleBeforeDimmingSeconds()*1000/Timer::TickDuration)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BacklightDimmingTimer::fire() {
|
bool BacklightDimmingTimer::fire(){
|
||||||
Ion::Backlight::setBrightness(k_dimBacklightBrightness);
|
int i = Ion::Backlight::brightness();
|
||||||
|
while (i > 0){
|
||||||
|
int t = 20;
|
||||||
|
Ion::Events::Event e = Ion::Events::getEvent(&t);
|
||||||
|
AppsContainer::sharedAppsContainer()->dispatchEvent(e);
|
||||||
|
if (e.isKeyboardEvent()){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ion::Backlight::setBrightness(i);
|
||||||
|
i -= 15;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ class BacklightDimmingTimer : public Timer {
|
|||||||
public:
|
public:
|
||||||
BacklightDimmingTimer();
|
BacklightDimmingTimer();
|
||||||
private:
|
private:
|
||||||
constexpr static int k_idleBeforeDimmingDuration = 30*1000; // In miliseconds
|
|
||||||
constexpr static int k_dimBacklightBrightness = 0;
|
|
||||||
bool fire() override;
|
bool fire() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -60,32 +60,36 @@ void BatteryView::drawRect(KDContext * ctx, KDRect rect) const {
|
|||||||
*'content' depends on the charge */
|
*'content' depends on the charge */
|
||||||
|
|
||||||
// Draw the left part
|
// Draw the left part
|
||||||
ctx->fillRect(KDRect(0, 0, k_elementWidth, k_batteryHeight), Palette::Battery);
|
ctx->fillRect(KDRect(0, 1, k_elementWidth, k_batteryHeight - 2), Palette::Battery);
|
||||||
|
|
||||||
|
// Draw top and bottom part
|
||||||
|
ctx->fillRect(KDRect(1, 0, k_batteryWidth-3, 1), Palette::Battery);
|
||||||
|
ctx->fillRect(KDRect(1, k_batteryHeight-1, k_batteryWidth-3, 1), Palette::Battery);
|
||||||
|
|
||||||
// Draw the middle part
|
// Draw the middle part
|
||||||
constexpr KDCoordinate batteryInsideX = k_elementWidth+k_separatorThickness;
|
constexpr KDCoordinate batteryInsideX = k_elementWidth+k_separatorThickness;
|
||||||
constexpr KDCoordinate batteryInsideWidth = k_batteryWidth-3*k_elementWidth-2*k_separatorThickness;
|
constexpr KDCoordinate batteryInsideWidth = k_batteryWidth-3*k_elementWidth-2*k_separatorThickness;
|
||||||
if (m_isCharging) {
|
if (m_isCharging) {
|
||||||
// Charging: Yellow background with flash
|
// Charging: Yellow background with flash
|
||||||
ctx->fillRect(KDRect(batteryInsideX, 0, batteryInsideWidth, k_batteryHeight), Palette::BatteryInCharge);
|
ctx->fillRect(KDRect(batteryInsideX, 2, batteryInsideWidth, k_batteryHeight-4), Palette::BatteryInCharge);
|
||||||
KDRect frame((k_batteryWidth-k_flashWidth)/2, 0, k_flashWidth, k_flashHeight);
|
KDRect frame((k_batteryWidth-k_flashWidth)/2, 0, k_flashWidth, k_flashHeight);
|
||||||
KDColor flashWorkingBuffer[BatteryView::k_flashHeight*BatteryView::k_flashWidth];
|
KDColor flashWorkingBuffer[BatteryView::k_flashHeight*BatteryView::k_flashWidth];
|
||||||
ctx->blendRectWithMask(frame, Palette::Battery, (const uint8_t *)flashMask, flashWorkingBuffer);
|
ctx->blendRectWithMask(frame, Palette::Battery, (const uint8_t *)flashMask, flashWorkingBuffer);
|
||||||
} else if (m_chargeState == Ion::Battery::Charge::LOW) {
|
} else if (m_chargeState == Ion::Battery::Charge::LOW) {
|
||||||
assert(!m_isPlugged);
|
assert(!m_isPlugged);
|
||||||
// Low: Quite empty battery
|
// Low: Quite empty battery
|
||||||
ctx->fillRect(KDRect(batteryInsideX, 0, 2*k_elementWidth, k_batteryHeight), Palette::BatteryLow);
|
ctx->fillRect(KDRect(batteryInsideX, 2, 2*k_elementWidth, k_batteryHeight-4), 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(3*k_elementWidth+k_separatorThickness, 2, k_batteryWidth-5*k_elementWidth-2*k_separatorThickness, k_batteryHeight-4), KDColor::blend(Palette::Toolbar, Palette::Battery, 128));
|
||||||
} else if (m_chargeState == Ion::Battery::Charge::SOMEWHERE_INBETWEEN) {
|
} else if (m_chargeState == Ion::Battery::Charge::SOMEWHERE_INBETWEEN) {
|
||||||
assert(!m_isPlugged);
|
assert(!m_isPlugged);
|
||||||
// Middle: Half full battery
|
// Middle: Half full battery
|
||||||
constexpr KDCoordinate middleChargeWidth = batteryInsideWidth/2;
|
constexpr KDCoordinate middleChargeWidth = batteryInsideWidth/2;
|
||||||
ctx->fillRect(KDRect(batteryInsideX, 0, middleChargeWidth, k_batteryHeight), Palette::Battery);
|
ctx->fillRect(KDRect(batteryInsideX, 2, middleChargeWidth, k_batteryHeight-4), Palette::Battery);
|
||||||
ctx->fillRect(KDRect(batteryInsideX+middleChargeWidth, 0, middleChargeWidth, k_batteryHeight), Palette::BatteryInCharge);
|
ctx->fillRect(KDRect(batteryInsideX+middleChargeWidth, 2, middleChargeWidth+1, k_batteryHeight-4), KDColor::blend(Palette::Toolbar, Palette::Battery, 128));
|
||||||
} else {
|
} else {
|
||||||
assert(m_chargeState == Ion::Battery::Charge::FULL);
|
assert(m_chargeState == Ion::Battery::Charge::FULL);
|
||||||
// Full but not plugged: Full battery
|
// Full but not plugged: Full battery
|
||||||
ctx->fillRect(KDRect(batteryInsideX, 0, batteryInsideWidth, k_batteryHeight), Palette::Battery);
|
ctx->fillRect(KDRect(batteryInsideX, 2, batteryInsideWidth, k_batteryHeight-4), Palette::Battery);
|
||||||
if (m_isPlugged) {
|
if (m_isPlugged) {
|
||||||
// Plugged and full: Full battery with tick
|
// Plugged and full: Full battery with tick
|
||||||
KDRect frame((k_batteryWidth-k_tickWidth)/2, (k_batteryHeight-k_tickHeight)/2, k_tickWidth, k_tickHeight);
|
KDRect frame((k_batteryWidth-k_tickWidth)/2, (k_batteryHeight-k_tickHeight)/2, k_tickWidth, k_tickHeight);
|
||||||
@@ -95,7 +99,7 @@ void BatteryView::drawRect(KDContext * ctx, KDRect rect) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Draw the right part
|
// Draw the right part
|
||||||
ctx->fillRect(KDRect(k_batteryWidth-2*k_elementWidth, 0, k_elementWidth, k_batteryHeight), Palette::Battery);
|
ctx->fillRect(KDRect(k_batteryWidth-2*k_elementWidth, 1, k_elementWidth, k_batteryHeight-2), 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-k_elementWidth, (k_batteryHeight-k_capHeight)/2, k_elementWidth, k_capHeight), Palette::Battery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,10 +20,10 @@ public:
|
|||||||
constexpr static int k_tickHeight = 6;
|
constexpr static int k_tickHeight = 6;
|
||||||
constexpr static int k_tickWidth = 8;
|
constexpr static int k_tickWidth = 8;
|
||||||
private:
|
private:
|
||||||
constexpr static KDCoordinate k_batteryHeight = 8;
|
constexpr static KDCoordinate k_batteryHeight = 9;
|
||||||
constexpr static KDCoordinate k_batteryWidth = 15;
|
constexpr static KDCoordinate k_batteryWidth = 16;
|
||||||
constexpr static KDCoordinate k_elementWidth = 1;
|
constexpr static KDCoordinate k_elementWidth = 1;
|
||||||
constexpr static KDCoordinate k_capHeight = 4;
|
constexpr static KDCoordinate k_capHeight = 3;
|
||||||
constexpr static KDCoordinate k_separatorThickness = Metric::CellSeparatorThickness;
|
constexpr static KDCoordinate k_separatorThickness = Metric::CellSeparatorThickness;
|
||||||
Ion::Battery::Charge m_chargeState;
|
Ion::Battery::Charge m_chargeState;
|
||||||
bool m_isCharging;
|
bool m_isCharging;
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ app_calculation_src = $(addprefix apps/calculation/,\
|
|||||||
additional_outputs/list_controller.cpp \
|
additional_outputs/list_controller.cpp \
|
||||||
additional_outputs/matrix_list_controller.cpp \
|
additional_outputs/matrix_list_controller.cpp \
|
||||||
additional_outputs/rational_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_graph_cell.cpp \
|
||||||
additional_outputs/trigonometry_list_controller.cpp \
|
additional_outputs/trigonometry_list_controller.cpp \
|
||||||
additional_outputs/trigonometry_model.cpp \
|
additional_outputs/trigonometry_model.cpp \
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#include "integer_list_controller.h"
|
#include "integer_list_controller.h"
|
||||||
#include <poincare/based_integer.h>
|
#include <poincare/based_integer.h>
|
||||||
|
#include <poincare/opposite.h>
|
||||||
#include <poincare/integer.h>
|
#include <poincare/integer.h>
|
||||||
|
#include <poincare/logarithm.h>
|
||||||
#include <poincare/empty_layout.h>
|
#include <poincare/empty_layout.h>
|
||||||
#include <poincare/factor.h>
|
#include <poincare/factor.h>
|
||||||
#include "../app.h"
|
#include "../app.h"
|
||||||
@@ -26,10 +28,30 @@ Integer::Base baseAtIndex(int index) {
|
|||||||
void IntegerListController::setExpression(Poincare::Expression e) {
|
void IntegerListController::setExpression(Poincare::Expression e) {
|
||||||
ExpressionsListController::setExpression(e);
|
ExpressionsListController::setExpression(e);
|
||||||
static_assert(k_maxNumberOfRows >= k_indexOfFactorExpression + 1, "k_maxNumberOfRows must be greater than k_indexOfFactorExpression");
|
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);
|
assert(!m_expression.isUninitialized() && m_expression.type() == ExpressionNode::Type::BasedInteger || (m_expression.type() == ExpressionNode::Type::Opposite && m_expression.childAtIndex(0).type() == ExpressionNode::Type::BasedInteger));
|
||||||
Integer integer = static_cast<BasedInteger &>(m_expression).integer();
|
assert(!m_expression.isUninitialized());
|
||||||
for (int index = 0; index < k_indexOfFactorExpression; ++index) {
|
|
||||||
m_layouts[index] = integer.createLayout(baseAtIndex(index));
|
if (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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Opposite b = static_cast<Opposite &>(m_expression);
|
||||||
|
Expression e = b.childAtIndex(0);
|
||||||
|
Integer childInt = static_cast<BasedInteger &>(e).integer();
|
||||||
|
childInt.setNegative(true);
|
||||||
|
Integer num_bits = Integer::CeilingLog2(childInt);
|
||||||
|
Integer integer = Integer::TwosComplementToBits(childInt, num_bits);
|
||||||
|
for (int index = 0; index < k_indexOfFactorExpression; ++index) {
|
||||||
|
if(baseAtIndex(index) == Integer::Base::Decimal) {
|
||||||
|
m_layouts[index] = childInt.createLayout(baseAtIndex(index));
|
||||||
|
} else {
|
||||||
|
m_layouts[index] = integer.createLayout(baseAtIndex(index));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Computing factorExpression
|
// Computing factorExpression
|
||||||
Expression factor = Factor::Builder(m_expression.clone());
|
Expression factor = Factor::Builder(m_expression.clone());
|
||||||
|
|||||||
@@ -0,0 +1,320 @@
|
|||||||
|
#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 = Opposite::Builder(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;
|
||||||
|
PoincareHelpers::Simplify(&minusBeta, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
Expression beta = getOppositeIfExists(minusBeta, &reductionContext);
|
||||||
|
if (beta.isUninitialized()) {
|
||||||
|
if (minusBeta.type() == ExpressionNode::Type::Addition || minusBeta.type() == ExpressionNode::Type::Subtraction) {
|
||||||
|
canonized = Subtraction::Builder(xMinusAlphaPowerTwoWithFactor, Parenthesis::Builder(minusBeta));
|
||||||
|
} else {
|
||||||
|
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);
|
||||||
|
if (x0.type() == ExpressionNode::Type::Addition || x0.type() == ExpressionNode::Type::Subtraction) {
|
||||||
|
firstFactor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), Parenthesis::Builder(x0.clone()));
|
||||||
|
} else {
|
||||||
|
firstFactor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), x0.clone());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (x0Opposite.type() == ExpressionNode::Type::Addition || x0Opposite.type() == ExpressionNode::Type::Subtraction) {
|
||||||
|
x0Opposite = Parenthesis::Builder(x0Opposite.clone());
|
||||||
|
}
|
||||||
|
firstFactor = Addition::Builder(Symbol::Builder("x", strlen("x")), x0Opposite.clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
Expression x1Opposite = getOppositeIfExists(x1, &reductionContext);
|
||||||
|
if (x1Opposite.isUninitialized()) {
|
||||||
|
PoincareHelpers::Simplify(&x1, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
if (x1.type() == ExpressionNode::Type::Addition || x1.type() == ExpressionNode::Type::Subtraction) {
|
||||||
|
secondFactor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), Parenthesis::Builder(x1.clone()));
|
||||||
|
} else {
|
||||||
|
secondFactor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), x1.clone());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PoincareHelpers::Simplify(&x1Opposite, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
if (x1Opposite.type() == ExpressionNode::Type::Addition || x1Opposite.type() == ExpressionNode::Type::Subtraction) {
|
||||||
|
x1Opposite = Parenthesis::Builder(x1Opposite.clone());
|
||||||
|
}
|
||||||
|
secondFactor = Addition::Builder(Symbol::Builder("x", strlen("x")), x1Opposite.clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
Expression solutionProduct = Multiplication::Builder(Parenthesis::Builder(firstFactor), Parenthesis::Builder(secondFactor));
|
||||||
|
switch (multiplicationTypeForA)
|
||||||
|
{
|
||||||
|
case MultiplicationTypeForA::Nothing:
|
||||||
|
factorized = solutionProduct;
|
||||||
|
break;
|
||||||
|
case MultiplicationTypeForA::Minus:
|
||||||
|
factorized = Opposite::Builder(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);
|
||||||
|
if (x0.type() == ExpressionNode::Type::Addition || x0.type() == ExpressionNode::Type::Subtraction) {
|
||||||
|
factor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), Parenthesis::Builder(x0.clone()));
|
||||||
|
} else {
|
||||||
|
factor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), x0.clone());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PoincareHelpers::Simplify(&x0Opposite, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
factor = Addition::Builder(Symbol::Builder("x", strlen("x")), x0Opposite.clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
Expression solutionProduct = Power::Builder(Parenthesis::Builder(factor), Rational::Builder(2));
|
||||||
|
switch (multiplicationTypeForA)
|
||||||
|
{
|
||||||
|
case MultiplicationTypeForA::Nothing:
|
||||||
|
factorized = solutionProduct;
|
||||||
|
break;
|
||||||
|
case MultiplicationTypeForA::Minus:
|
||||||
|
factorized = Opposite::Builder(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::Opposite) {
|
||||||
|
return std::move(e.childAtIndex(0).clone());
|
||||||
|
} 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
@@ -8,7 +8,8 @@ namespace Calculation {
|
|||||||
|
|
||||||
TrigonometryGraphView::TrigonometryGraphView(TrigonometryModel * model) :
|
TrigonometryGraphView::TrigonometryGraphView(TrigonometryModel * model) :
|
||||||
CurveView(model),
|
CurveView(model),
|
||||||
m_model(model)
|
m_model(model),
|
||||||
|
m_shouldDisplayTan(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,17 +23,33 @@ void TrigonometryGraphView::drawRect(KDContext * ctx, KDRect rect) const {
|
|||||||
drawCurve(ctx, rect, 0.0f, 2.0f*M_PI, M_PI/180.0f, [](float t, void * model, void * context) {
|
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));
|
return Poincare::Coordinate2D<float>(std::cos(t), std::sin(t));
|
||||||
}, nullptr, nullptr, true, Palette::SecondaryText, false);
|
}, 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);
|
if (!m_shouldDisplayTan) {
|
||||||
drawHorizontalOrVerticalSegment(ctx, rect, Axis::Horizontal, s, 0.0f, c, Palette::CalculationTrigoAndComplexForeground, 1, 3);
|
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_shouldDisplayTan) {
|
||||||
|
float t = std::tan(m_model->angle());
|
||||||
|
drawHorizontalOrVerticalSegment(ctx, rect, Axis::Vertical, 1.0f, m_model->yMin(), m_model->yMax(), Palette::SecondaryText, 2);
|
||||||
|
drawSegment(ctx, rect, 0.0f, 0.0f, 1.0f, t, Palette::SecondaryText, false);
|
||||||
|
drawDot(ctx, rect, 1.0f, t, Palette::CalculationTrigoAndComplexForeground, Size::Large);
|
||||||
|
drawLabel(ctx, rect, 0.0f, t, "tan(θ)", Palette::CalculationTrigoAndComplexForeground, CurveView::RelativePosition::Before, CurveView::RelativePosition::None);
|
||||||
|
drawHorizontalOrVerticalSegment(ctx, rect, Axis::Horizontal, t, 0.0f, 1.0f, Palette::CalculationTrigoAndComplexForeground, 1, 3);
|
||||||
|
}
|
||||||
|
|
||||||
// Draw angle position on the circle
|
// Draw angle position on the circle
|
||||||
drawDot(ctx, rect, c, s, Palette::CalculationTrigoAndComplexForeground, Size::Large);
|
drawDot(ctx, rect, c, s, m_shouldDisplayTan ? Palette::SecondaryText : Palette::CalculationTrigoAndComplexForeground, m_shouldDisplayTan ? Size::Tiny : Size::Large);
|
||||||
// Draw graduations
|
// Draw graduations
|
||||||
drawLabelsAndGraduations(ctx, rect, Axis::Vertical, false, true);
|
drawLabelsAndGraduations(ctx, rect, Axis::Vertical, false, true);
|
||||||
drawLabelsAndGraduations(ctx, rect, Axis::Horizontal, 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);
|
if (!m_shouldDisplayTan) {
|
||||||
drawLabel(ctx, rect, c, 0.0f, "cos(θ)", Palette::CalculationTrigoAndComplexForeground, CurveView::RelativePosition::None, s >= 0.0f ? CurveView::RelativePosition::Before : CurveView::RelativePosition::After);
|
// 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,13 +11,16 @@ class TrigonometryGraphView : public Shared::CurveView {
|
|||||||
public:
|
public:
|
||||||
TrigonometryGraphView(TrigonometryModel * model);
|
TrigonometryGraphView(TrigonometryModel * model);
|
||||||
void drawRect(KDContext * ctx, KDRect rect) const override;
|
void drawRect(KDContext * ctx, KDRect rect) const override;
|
||||||
|
void setShouldDisplayTan(bool shouldDisplayTan) { m_shouldDisplayTan = shouldDisplayTan; };
|
||||||
private:
|
private:
|
||||||
TrigonometryModel * m_model;
|
TrigonometryModel * m_model;
|
||||||
|
bool m_shouldDisplayTan;
|
||||||
};
|
};
|
||||||
|
|
||||||
class TrigonometryGraphCell : public IllustrationCell {
|
class TrigonometryGraphCell : public IllustrationCell {
|
||||||
public:
|
public:
|
||||||
TrigonometryGraphCell(TrigonometryModel * model) : m_view(model) {}
|
TrigonometryGraphCell(TrigonometryModel * model) : m_view(model) {}
|
||||||
|
void setShouldDisplayTan(bool shouldDisplayTan) { m_view.setShouldDisplayTan(shouldDisplayTan); };
|
||||||
private:
|
private:
|
||||||
View * view() override { return &m_view; }
|
View * view() override { return &m_view; }
|
||||||
TrigonometryGraphView m_view;
|
TrigonometryGraphView m_view;
|
||||||
|
|||||||
@@ -1,16 +1,67 @@
|
|||||||
#include "trigonometry_list_controller.h"
|
#include "trigonometry_list_controller.h"
|
||||||
#include "../app.h"
|
#include "../app.h"
|
||||||
|
#include <poincare_nodes.h>
|
||||||
|
#include "../../shared/poincare_helpers.h"
|
||||||
|
|
||||||
using namespace Poincare;
|
using namespace Poincare;
|
||||||
|
|
||||||
namespace Calculation {
|
namespace Calculation {
|
||||||
|
|
||||||
void TrigonometryListController::setExpression(Poincare::Expression e) {
|
static constexpr int s_fullCircle[] = {
|
||||||
assert(e.type() == ExpressionNode::Type::Cosine || e.type() == ExpressionNode::Type::Sine);
|
360,
|
||||||
IllustratedListController::setExpression(e.childAtIndex(0));
|
2,
|
||||||
|
400
|
||||||
|
};
|
||||||
|
|
||||||
|
Poincare::Constant toConstant(Expression e) {
|
||||||
|
return static_cast<Poincare::Constant &>(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrigonometryListController::setExpression(Expression e) {
|
||||||
|
assert(e.type() == ExpressionNode::Type::Cosine || e.type() == ExpressionNode::Type::Sine || e.type() == ExpressionNode::Type::Tangent);
|
||||||
|
bool shouldDisplayTan = e.type() == ExpressionNode::Type::Tangent;
|
||||||
|
m_graphCell.setShouldDisplayTan(shouldDisplayTan);
|
||||||
|
m_model.setShouldDisplayTan(shouldDisplayTan);
|
||||||
|
|
||||||
|
Poincare::Context * context = App::app()->localContext();
|
||||||
|
Poincare::Preferences * preferences = Poincare::Preferences::sharedPreferences();
|
||||||
|
Preferences::AngleUnit angleUnit = preferences->angleUnit();
|
||||||
|
|
||||||
|
Expression angleExpression = e.childAtIndex(0);
|
||||||
|
|
||||||
|
Shared::PoincareHelpers::Reduce(&angleExpression, context, Poincare::ExpressionNode::ReductionTarget::SystemForAnalysis);
|
||||||
|
|
||||||
|
if ((angleUnit == Preferences::AngleUnit::Radian
|
||||||
|
&& angleExpression.type() == ExpressionNode::Type::Multiplication
|
||||||
|
&& angleExpression.numberOfChildren() == 2
|
||||||
|
&& angleExpression.childAtIndex(1).type() == ExpressionNode::Type::Constant
|
||||||
|
&& toConstant(angleExpression.childAtIndex(1)).isPi()
|
||||||
|
&& angleExpression.childAtIndex(0).type() == ExpressionNode::Type::Rational)
|
||||||
|
|| ((angleUnit == Preferences::AngleUnit::Degree || angleUnit == Preferences::AngleUnit::Gradian)
|
||||||
|
&& angleExpression.type() == ExpressionNode::Type::Rational)) {
|
||||||
|
|
||||||
|
Expression extracted = angleUnit == Preferences::AngleUnit::Radian ? angleExpression.childAtIndex(0) : angleExpression;
|
||||||
|
Rational r = static_cast<Rational &>(extracted);
|
||||||
|
|
||||||
|
Integer denominator = Integer::Multiplication(r.integerDenominator(), Integer(s_fullCircle[(int) angleUnit]));
|
||||||
|
IntegerDivision division = Integer::Division(r.signedIntegerNumerator(), denominator);
|
||||||
|
|
||||||
|
Integer remainder = division.remainder;
|
||||||
|
|
||||||
|
Expression newAngle;
|
||||||
|
Integer rDenominator = r.integerDenominator();
|
||||||
|
Rational newCoefficient = Rational::Builder(remainder, rDenominator);
|
||||||
|
if (angleUnit == Preferences::AngleUnit::Radian) {
|
||||||
|
angleExpression = Multiplication::Builder(newCoefficient, angleExpression.childAtIndex(1));
|
||||||
|
} else {
|
||||||
|
angleExpression = newCoefficient;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IllustratedListController::setExpression(angleExpression);
|
||||||
|
|
||||||
// Fill calculation store
|
// Fill calculation store
|
||||||
Poincare::Context * context = App::app()->localContext();
|
m_calculationStore.push("tan(θ)", context, CalculationHeight);
|
||||||
m_calculationStore.push("sin(θ)", context, CalculationHeight);
|
m_calculationStore.push("sin(θ)", context, CalculationHeight);
|
||||||
m_calculationStore.push("cos(θ)", context, CalculationHeight);
|
m_calculationStore.push("cos(θ)", context, CalculationHeight);
|
||||||
m_calculationStore.push("θ", context, CalculationHeight);
|
m_calculationStore.push("θ", context, CalculationHeight);
|
||||||
|
|||||||
@@ -8,4 +8,22 @@ TrigonometryModel::TrigonometryModel() :
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float TrigonometryModel::yMin() const {
|
||||||
|
if (m_shouldDisplayTan) {
|
||||||
|
return -1.1f;
|
||||||
|
}
|
||||||
|
return yCenter() - yHalfRange();
|
||||||
|
}
|
||||||
|
|
||||||
|
float TrigonometryModel::yMax() const {
|
||||||
|
if (m_shouldDisplayTan) {
|
||||||
|
float t = std::tan(angle());
|
||||||
|
if (t <= 1.2f) {
|
||||||
|
return 1.2f;
|
||||||
|
}
|
||||||
|
return 1.2f * std::tan(angle());
|
||||||
|
}
|
||||||
|
return yCenter() + yHalfRange();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,11 +14,12 @@ public:
|
|||||||
// CurveViewRange
|
// CurveViewRange
|
||||||
float xMin() const override { return -k_xHalfRange; }
|
float xMin() const override { return -k_xHalfRange; }
|
||||||
float xMax() const override { return k_xHalfRange; }
|
float xMax() const override { return k_xHalfRange; }
|
||||||
float yMin() const override { return yCenter() - yHalfRange(); }
|
float yMin() const override;
|
||||||
float yMax() const override { return yCenter() + yHalfRange(); }
|
float yMax() const override;
|
||||||
|
|
||||||
void setAngle(float f) { m_angle = f; }
|
void setAngle(float f) { m_angle = f; }
|
||||||
float angle() const { return m_angle*(float)M_PI/(float)Poincare::Trigonometry::PiInAngleUnit(Poincare::Preferences::sharedPreferences()->angleUnit()); }
|
float angle() const { return m_angle*(float)M_PI/(float)Poincare::Trigonometry::PiInAngleUnit(Poincare::Preferences::sharedPreferences()->angleUnit()); }
|
||||||
|
void setShouldDisplayTan(bool shouldDisplayTan) { m_shouldDisplayTan = shouldDisplayTan; }
|
||||||
private:
|
private:
|
||||||
constexpr static float k_xHalfRange = 2.1f;
|
constexpr static float k_xHalfRange = 2.1f;
|
||||||
// We center the yRange around the semi-circle where the angle is
|
// We center the yRange around the semi-circle where the angle is
|
||||||
@@ -33,6 +34,7 @@ private:
|
|||||||
float yHalfRange() const { return IllustratedListController::k_illustrationHeight*k_xHalfRange/(Ion::Display::Width - Metric::PopUpRightMargin - Metric::PopUpLeftMargin); }
|
float yHalfRange() const { return IllustratedListController::k_illustrationHeight*k_xHalfRange/(Ion::Display::Width - Metric::PopUpRightMargin - Metric::PopUpLeftMargin); }
|
||||||
|
|
||||||
float m_angle;
|
float m_angle;
|
||||||
|
bool m_shouldDisplayTan;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,26 @@ using namespace Shared;
|
|||||||
|
|
||||||
namespace Calculation {
|
namespace Calculation {
|
||||||
|
|
||||||
|
|
||||||
|
UnitListController::UnitListController(EditExpressionController * editExpressionController) :
|
||||||
|
ExpressionsListController(editExpressionController),
|
||||||
|
m_dimensionMessage(I18n::Message::Default)
|
||||||
|
{
|
||||||
|
m_dimensionCell.setMessageFont(KDFont::LargeFont);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UnitListController::handleEvent(Ion::Events::Event event) {
|
||||||
|
if (selectedRow() == 0 && (event == Ion::Events::OK || event == Ion::Events::EXE)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// HACK: Change the selected row (prevent some bugs when OK is pressed)
|
||||||
|
selectRow(selectedRow() - 1);
|
||||||
|
bool value = ListController::handleEvent(event);
|
||||||
|
selectRow(selectedRow() + 1);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
void UnitListController::setExpression(Poincare::Expression e) {
|
void UnitListController::setExpression(Poincare::Expression e) {
|
||||||
ExpressionsListController::setExpression(e);
|
ExpressionsListController::setExpression(e);
|
||||||
assert(!m_expression.isUninitialized());
|
assert(!m_expression.isUninitialized());
|
||||||
@@ -22,6 +42,7 @@ void UnitListController::setExpression(Poincare::Expression e) {
|
|||||||
for (size_t i = 0; i < k_maxNumberOfRows; i++) {
|
for (size_t i = 0; i < k_maxNumberOfRows; i++) {
|
||||||
expressions[i] = Expression();
|
expressions[i] = Expression();
|
||||||
}
|
}
|
||||||
|
m_dimensionMessage = I18n::Message::Default;
|
||||||
|
|
||||||
/* 1. First rows: miscellaneous classic units for some dimensions, in both
|
/* 1. First rows: miscellaneous classic units for some dimensions, in both
|
||||||
* metric and imperial units. */
|
* metric and imperial units. */
|
||||||
@@ -37,7 +58,7 @@ void UnitListController::setExpression(Poincare::Expression e) {
|
|||||||
GlobalPreferences::sharedGlobalPreferences()->unitFormat(),
|
GlobalPreferences::sharedGlobalPreferences()->unitFormat(),
|
||||||
ExpressionNode::ReductionTarget::User,
|
ExpressionNode::ReductionTarget::User,
|
||||||
ExpressionNode::SymbolicComputation::ReplaceAllSymbolsWithDefinitionsOrUndefined);
|
ExpressionNode::SymbolicComputation::ReplaceAllSymbolsWithDefinitionsOrUndefined);
|
||||||
int numberOfExpressions = Unit::SetAdditionalExpressions(units, value, expressions, k_maxNumberOfRows, reductionContext);
|
int numberOfExpressions = Unit::SetAdditionalExpressionsAndMessage(units, value, expressions, k_maxNumberOfRows, reductionContext, &m_dimensionMessage);
|
||||||
|
|
||||||
// 2. SI units only
|
// 2. SI units only
|
||||||
assert(numberOfExpressions < k_maxNumberOfRows - 1);
|
assert(numberOfExpressions < k_maxNumberOfRows - 1);
|
||||||
@@ -89,6 +110,44 @@ void UnitListController::setExpression(Poincare::Expression e) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int UnitListController::numberOfRows() const {
|
||||||
|
int messageRow = m_dimensionMessage != I18n::Message::Default ? 1 : 0;
|
||||||
|
return ExpressionsListController::numberOfRows() + messageRow;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnitListController::willDisplayCellForIndex(HighlightCell * cell, int index) {
|
||||||
|
if (index == 0) {
|
||||||
|
MessageTableCell<> * messageTableCell = (MessageTableCell<> *)cell;
|
||||||
|
messageTableCell->setMessage(m_dimensionMessage);
|
||||||
|
} else {
|
||||||
|
ExpressionsListController::willDisplayCellForIndex(cell, index - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
KDCoordinate UnitListController::rowHeight(int index) {
|
||||||
|
if (index == 0) {
|
||||||
|
return 35;
|
||||||
|
} else {
|
||||||
|
return ExpressionsListController::rowHeight(index - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HighlightCell * UnitListController::reusableCell(int index, int type) {
|
||||||
|
if (type == 0) {
|
||||||
|
return ExpressionsListController::reusableCell(index, type);
|
||||||
|
} else {
|
||||||
|
return &m_dimensionCell;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int UnitListController::typeAtLocation(int i, int j) {
|
||||||
|
if (j == 0) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return ExpressionsListController::typeAtLocation(i, j - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
I18n::Message UnitListController::messageAtIndex(int index) {
|
I18n::Message UnitListController::messageAtIndex(int index) {
|
||||||
return (I18n::Message)0;
|
return (I18n::Message)0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,13 +7,23 @@ namespace Calculation {
|
|||||||
|
|
||||||
class UnitListController : public ExpressionsListController {
|
class UnitListController : public ExpressionsListController {
|
||||||
public:
|
public:
|
||||||
UnitListController(EditExpressionController * editExpressionController) :
|
UnitListController(EditExpressionController * editExpressionController);
|
||||||
ExpressionsListController(editExpressionController) {}
|
|
||||||
|
/* Responder */
|
||||||
|
bool handleEvent(Ion::Events::Event event) override;
|
||||||
|
|
||||||
void setExpression(Poincare::Expression e) override;
|
void setExpression(Poincare::Expression e) override;
|
||||||
|
int reusableCellCount(int type) override { return type == 0 ? ExpressionsListController::reusableCellCount(type) : 1; }
|
||||||
|
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;
|
||||||
|
int numberOfRows() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
I18n::Message messageAtIndex(int index) override;
|
I18n::Message messageAtIndex(int index) override;
|
||||||
|
I18n::Message m_dimensionMessage;
|
||||||
|
MessageTableCell<> m_dimensionCell;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ bool App::isAcceptableExpression(const Poincare::Expression expression) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return !(expression.isUninitialized() || expression.type() == ExpressionNode::Type::Equal);
|
return !expression.isUninitialized();
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::didBecomeActive(Window * window) {
|
void App::didBecomeActive(Window * window) {
|
||||||
|
|||||||
@@ -11,4 +11,10 @@ AdditionalDeterminant = "Determinante"
|
|||||||
AdditionalInverse = "Inverse"
|
AdditionalInverse = "Inverse"
|
||||||
AdditionalRowEchelonForm = "Stufenform"
|
AdditionalRowEchelonForm = "Stufenform"
|
||||||
AdditionalReducedRowEchelonForm = "Reduzierte Stufenform"
|
AdditionalReducedRowEchelonForm = "Reduzierte Stufenform"
|
||||||
AdditionalTrace = "Spur"
|
AdditionalTrace = "Spur"
|
||||||
|
CanonicalForm = "Kanonische Form"
|
||||||
|
FactorizedForm = "Factorisierte Form"
|
||||||
|
Discriminant = "Diskriminante"
|
||||||
|
OnlyRoot = "Wurzel"
|
||||||
|
FirstRoot = "Erste Wurzel"
|
||||||
|
SecondRoot = "Zweite Wurzel"
|
||||||
|
|||||||
@@ -12,3 +12,9 @@ AdditionalInverse = "Inverse"
|
|||||||
AdditionalRowEchelonForm = "Row echelon form"
|
AdditionalRowEchelonForm = "Row echelon form"
|
||||||
AdditionalReducedRowEchelonForm = "Reduced row echelon form"
|
AdditionalReducedRowEchelonForm = "Reduced row echelon form"
|
||||||
AdditionalTrace = "Trace"
|
AdditionalTrace = "Trace"
|
||||||
|
CanonicalForm = "Canonical form"
|
||||||
|
FactorizedForm = "Factorized form"
|
||||||
|
Discriminant = "Discriminant"
|
||||||
|
OnlyRoot = "Root"
|
||||||
|
FirstRoot = "First root"
|
||||||
|
SecondRoot = "Second root"
|
||||||
|
|||||||
@@ -11,4 +11,10 @@ AdditionalDeterminant = "Determinante"
|
|||||||
AdditionalInverse = "Inversa"
|
AdditionalInverse = "Inversa"
|
||||||
AdditionalRowEchelonForm = "Matriz escalonada"
|
AdditionalRowEchelonForm = "Matriz escalonada"
|
||||||
AdditionalReducedRowEchelonForm = "Matriz escalonada reducida"
|
AdditionalReducedRowEchelonForm = "Matriz escalonada reducida"
|
||||||
AdditionalTrace = "Traza"
|
AdditionalTrace = "Traza"
|
||||||
|
CanonicalForm = "Forma canónica"
|
||||||
|
FactorizedForm = "Forma factorizada"
|
||||||
|
Discriminant = "Discriminante"
|
||||||
|
OnlyRoot = "Raíz"
|
||||||
|
FirstRoot = "Primera raíz"
|
||||||
|
SecondRoot = "Segunda raíz"
|
||||||
|
|||||||
@@ -11,4 +11,10 @@ AdditionalDeterminant = "Déterminant"
|
|||||||
AdditionalInverse = "Inverse"
|
AdditionalInverse = "Inverse"
|
||||||
AdditionalRowEchelonForm = "Forme échelonnée"
|
AdditionalRowEchelonForm = "Forme échelonnée"
|
||||||
AdditionalReducedRowEchelonForm = "Forme échelonnée réduite"
|
AdditionalReducedRowEchelonForm = "Forme échelonnée réduite"
|
||||||
AdditionalTrace = "Trace"
|
AdditionalTrace = "Trace"
|
||||||
|
CanonicalForm = "Forme canonique"
|
||||||
|
FactorizedForm = "Forme factorisée"
|
||||||
|
Discriminant = "Discriminant"
|
||||||
|
OnlyRoot = "Racine"
|
||||||
|
FirstRoot = "Première racine"
|
||||||
|
SecondRoot = "Seconde racine"
|
||||||
|
|||||||
@@ -1,14 +1,20 @@
|
|||||||
CalculApp = "Számolás"
|
CalculApp = "Számolás"
|
||||||
CalculAppCapital = "SZÁMOLÁS"
|
CalculAppCapital = "SZÁMOLÁS"
|
||||||
AdditionalResults = "További eredmények"
|
AdditionalResults = "További eredmények"
|
||||||
DecimalBase = "Decimális"
|
DecimalBase = "Decimális"
|
||||||
HexadecimalBase = "Hexadecimális"
|
HexadecimalBase = "Hexadecimális"
|
||||||
BinaryBase = "Bináris"
|
BinaryBase = "Bináris"
|
||||||
PrimeFactors = "Alapvetö tényezök"
|
PrimeFactors = "Alapvetö tényezök"
|
||||||
MixedFraction = "Vegyes frakció"
|
MixedFraction = "Vegyes frakció"
|
||||||
EuclideanDivision = "Euklideszi osztás"
|
EuclideanDivision = "Euklideszi osztás"
|
||||||
AdditionalDeterminant = "Meghatározó"
|
AdditionalDeterminant = "Meghatározó"
|
||||||
AdditionalInverse = "inverz"
|
AdditionalInverse = "inverz"
|
||||||
AdditionalRowEchelonForm = "Sor echelon forma"
|
AdditionalRowEchelonForm = "Sor echelon forma"
|
||||||
AdditionalReducedRowEchelonForm = "Csökkentett sorú Echelon forma"
|
AdditionalReducedRowEchelonForm = "Csökkentett sorú Echelon forma"
|
||||||
AdditionalTrace = "Nyomkövetés"
|
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"
|
||||||
|
|||||||
@@ -11,4 +11,10 @@ AdditionalDeterminant = "Determinante"
|
|||||||
AdditionalInverse = "Inversa"
|
AdditionalInverse = "Inversa"
|
||||||
AdditionalRowEchelonForm = "Matrice a scalini"
|
AdditionalRowEchelonForm = "Matrice a scalini"
|
||||||
AdditionalReducedRowEchelonForm = "Matrice ridotta a scalini"
|
AdditionalReducedRowEchelonForm = "Matrice ridotta a scalini"
|
||||||
AdditionalTrace = "Traccia"
|
AdditionalTrace = "Traccia"
|
||||||
|
CanonicalForm = "Forma canonica"
|
||||||
|
FactorizedForm = "Forma fattorizzata"
|
||||||
|
Discriminant = "Discriminante"
|
||||||
|
OnlyRoot = "Radice"
|
||||||
|
FirstRoot = "Prima radice"
|
||||||
|
SecondRoot = "Seconda radice"
|
||||||
|
|||||||
@@ -11,4 +11,10 @@ AdditionalDeterminant = "Determinant"
|
|||||||
AdditionalInverse = "Inverse"
|
AdditionalInverse = "Inverse"
|
||||||
AdditionalRowEchelonForm = "Echelonvorm"
|
AdditionalRowEchelonForm = "Echelonvorm"
|
||||||
AdditionalReducedRowEchelonForm = "Gereduceerde echelonvorm"
|
AdditionalReducedRowEchelonForm = "Gereduceerde echelonvorm"
|
||||||
AdditionalTrace = "Spoor"
|
AdditionalTrace = "Spoor"
|
||||||
|
CanonicalForm = "Canonische vorm"
|
||||||
|
FactorizedForm = "Factorized vorm"
|
||||||
|
Discriminant = "Discriminant"
|
||||||
|
OnlyRoot = "Wortel"
|
||||||
|
FirstRoot = "Eerste wortel"
|
||||||
|
SecondRoot = "Tweede wortel"
|
||||||
|
|||||||
@@ -11,4 +11,10 @@ AdditionalDeterminant = "Determinante"
|
|||||||
AdditionalInverse = "Matriz inversa"
|
AdditionalInverse = "Matriz inversa"
|
||||||
AdditionalRowEchelonForm = "Matriz escalonada"
|
AdditionalRowEchelonForm = "Matriz escalonada"
|
||||||
AdditionalReducedRowEchelonForm = "Matriz escalonada reduzida"
|
AdditionalReducedRowEchelonForm = "Matriz escalonada reduzida"
|
||||||
AdditionalTrace = "Traço"
|
AdditionalTrace = "Traço"
|
||||||
|
CanonicalForm = "Forma canónica"
|
||||||
|
FactorizedForm = "Factorized form"
|
||||||
|
Discriminant = "Discriminante"
|
||||||
|
OnlyRoot = "Raiz"
|
||||||
|
FirstRoot = "Primeira raiz"
|
||||||
|
SecondRoot = "Segunda raiz"
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include <poincare/undefined.h>
|
#include <poincare/undefined.h>
|
||||||
#include <poincare/unit.h>
|
#include <poincare/unit.h>
|
||||||
#include <poincare/unreal.h>
|
#include <poincare/unreal.h>
|
||||||
|
#include <poincare/symbol_abstract.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@@ -250,14 +251,18 @@ Calculation::AdditionalInformationType Calculation::additionalInformationType(Co
|
|||||||
* - > input: 2cos(2) - cos(2)
|
* - > input: 2cos(2) - cos(2)
|
||||||
* > output: cos(2)
|
* > output: cos(2)
|
||||||
*/
|
*/
|
||||||
if (input().isDefinedCosineOrSine(context, complexFormat, preferences->angleUnit()) || o.isDefinedCosineOrSine(context, complexFormat, preferences->angleUnit())) {
|
if (i.isDefinedCosineOrSineOrTangent(context, complexFormat, preferences->angleUnit())) {
|
||||||
return AdditionalInformationType::Trigonometry;
|
return AdditionalInformationType::TrigonometryInput;
|
||||||
|
}
|
||||||
|
if (o.isDefinedCosineOrSineOrTangent(context, complexFormat, preferences->angleUnit())) {
|
||||||
|
return AdditionalInformationType::TrigonometryOutput;
|
||||||
}
|
}
|
||||||
if (o.hasUnit()) {
|
if (o.hasUnit()) {
|
||||||
Expression unit;
|
Expression unit;
|
||||||
PoincareHelpers::ReduceAndRemoveUnit(&o, App::app()->localContext(), ExpressionNode::ReductionTarget::User, &unit, ExpressionNode::SymbolicComputation::ReplaceAllSymbolsWithDefinitionsOrUndefined, ExpressionNode::UnitConversion::None);
|
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());
|
UnitNode::Vector<int> vector = UnitNode::Vector<int>::FromBaseUnits(unit);
|
||||||
return (Unit::ShouldDisplayAdditionalOutputs(value, unit, GlobalPreferences::sharedGlobalPreferences()->unitFormat())) ? AdditionalInformationType::Unit : AdditionalInformationType::None;
|
const Unit::Representative * representative = Unit::Representative::RepresentativeForDimension(vector);
|
||||||
|
return representative != nullptr ? AdditionalInformationType::Unit : AdditionalInformationType::None;
|
||||||
}
|
}
|
||||||
if (o.isBasedIntegerCappedBy(k_maximalIntegerWithAdditionalInformation)) {
|
if (o.isBasedIntegerCappedBy(k_maximalIntegerWithAdditionalInformation)) {
|
||||||
return AdditionalInformationType::Integer;
|
return AdditionalInformationType::Integer;
|
||||||
@@ -272,6 +277,9 @@ Calculation::AdditionalInformationType Calculation::additionalInformationType(Co
|
|||||||
if (o.type() == ExpressionNode::Type::Matrix) {
|
if (o.type() == ExpressionNode::Type::Matrix) {
|
||||||
return AdditionalInformationType::Matrix;
|
return AdditionalInformationType::Matrix;
|
||||||
}
|
}
|
||||||
|
if (o.polynomialDegree(context, "x") == 2) {
|
||||||
|
return AdditionalInformationType::SecondDegree;
|
||||||
|
}
|
||||||
return AdditionalInformationType::None;
|
return AdditionalInformationType::None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,9 @@ public:
|
|||||||
None = 0,
|
None = 0,
|
||||||
Integer,
|
Integer,
|
||||||
Rational,
|
Rational,
|
||||||
Trigonometry,
|
SecondDegree,
|
||||||
|
TrigonometryInput,
|
||||||
|
TrigonometryOutput,
|
||||||
Unit,
|
Unit,
|
||||||
Matrix,
|
Matrix,
|
||||||
Complex
|
Complex
|
||||||
@@ -96,7 +98,7 @@ public:
|
|||||||
AdditionalInformationType additionalInformationType(Poincare::Context * context);
|
AdditionalInformationType additionalInformationType(Poincare::Context * context);
|
||||||
private:
|
private:
|
||||||
static constexpr KDCoordinate k_heightComputationFailureHeight = 50;
|
static constexpr KDCoordinate k_heightComputationFailureHeight = 50;
|
||||||
static constexpr const char * k_maximalIntegerWithAdditionalInformation = "10000000000000000";
|
static constexpr const char * k_maximalIntegerWithAdditionalInformation = "18446744073709551617"; // 2^64 + 1
|
||||||
|
|
||||||
void setHeights(KDCoordinate height, KDCoordinate expandedHeight);
|
void setHeights(KDCoordinate height, KDCoordinate expandedHeight);
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,39 @@
|
|||||||
#include "../exam_mode_configuration.h"
|
#include "../exam_mode_configuration.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
#if defined _FXCG || defined NSPIRE_NEWLIB
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <apps/shared/global_context.h>
|
||||||
|
|
||||||
|
static KDCoordinate dummyHeight(::Calculation::Calculation * c, bool expanded) {
|
||||||
|
bool b;
|
||||||
|
Poincare::Layout l = c->createExactOutputLayout(&b);
|
||||||
|
if (!b) {
|
||||||
|
l=c->createInputLayout();
|
||||||
|
}
|
||||||
|
KDSize s = l.layoutSize();
|
||||||
|
const int bordersize = 10;
|
||||||
|
int h = s.height() + bordersize;
|
||||||
|
const int maxheight = 64;
|
||||||
|
if (h > maxheight) {
|
||||||
|
return maxheight;
|
||||||
|
}
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern void * last_calculation_history;
|
||||||
|
void * last_calculation_history = 0;
|
||||||
|
const char * retrieve_calc_history();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace Poincare;
|
using namespace Poincare;
|
||||||
using namespace Shared;
|
using namespace Shared;
|
||||||
|
|
||||||
@@ -16,16 +49,55 @@ CalculationStore::CalculationStore(char * buffer, int size) :
|
|||||||
m_buffer(buffer),
|
m_buffer(buffer),
|
||||||
m_bufferSize(size),
|
m_bufferSize(size),
|
||||||
m_calculationAreaEnd(m_buffer),
|
m_calculationAreaEnd(m_buffer),
|
||||||
m_numberOfCalculations(0)
|
m_numberOfCalculations(0),
|
||||||
|
m_trashIndex(-1)
|
||||||
{
|
{
|
||||||
assert(m_buffer != nullptr);
|
assert(m_buffer != nullptr);
|
||||||
assert(m_bufferSize > 0);
|
assert(m_bufferSize > 0);
|
||||||
|
#if defined _FXCG || defined NSPIRE_NEWLIB
|
||||||
|
if (last_calculation_history == 0){
|
||||||
|
// Restore from scriptstore
|
||||||
|
const char * buf=retrieve_calc_history();
|
||||||
|
if (buf) {
|
||||||
|
Shared::GlobalContext globalContext;
|
||||||
|
char * ptr=(char *)buf;
|
||||||
|
for (;*ptr;) {
|
||||||
|
for (;*ptr;++ptr) {
|
||||||
|
if (*ptr=='\n') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
char c = *ptr;
|
||||||
|
*ptr=0;
|
||||||
|
if (ptr > buf) {
|
||||||
|
push(buf,&globalContext, dummyHeight);
|
||||||
|
}
|
||||||
|
*ptr = c;
|
||||||
|
++ptr;
|
||||||
|
buf = ptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
last_calculation_history = (void *) this;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns an expiring pointer to the calculation of index i
|
// Returns an expiring pointer to the calculation of index i, and ignore the trash
|
||||||
ExpiringPointer<Calculation> CalculationStore::calculationAtIndex(int i) {
|
ExpiringPointer<Calculation> CalculationStore::calculationAtIndex(int i) {
|
||||||
|
#if defined _FXCG || defined NSPIRE_NEWLIB
|
||||||
|
last_calculation_history = (void *) this;
|
||||||
|
#endif
|
||||||
|
if (m_trashIndex == -1 || i < m_trashIndex) {
|
||||||
|
return realCalculationAtIndex(i);
|
||||||
|
} else {
|
||||||
|
return realCalculationAtIndex(i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns an expiring pointer to the real calculation of index i
|
||||||
|
ExpiringPointer<Calculation> CalculationStore::realCalculationAtIndex(int i) {
|
||||||
assert(i >= 0 && i < m_numberOfCalculations);
|
assert(i >= 0 && i < m_numberOfCalculations);
|
||||||
// m_buffer is the adress of the oldest calculation in calculation store
|
// m_buffer is the address of the oldest calculation in calculation store
|
||||||
Calculation * c = (Calculation *) m_buffer;
|
Calculation * c = (Calculation *) m_buffer;
|
||||||
if (i != m_numberOfCalculations-1) {
|
if (i != m_numberOfCalculations-1) {
|
||||||
// The calculation we want is not the oldest one so we get its pointer
|
// The calculation we want is not the oldest one so we get its pointer
|
||||||
@@ -36,12 +108,13 @@ ExpiringPointer<Calculation> CalculationStore::calculationAtIndex(int i) {
|
|||||||
|
|
||||||
// Pushes an expression in the store
|
// Pushes an expression in the store
|
||||||
ExpiringPointer<Calculation> CalculationStore::push(const char * text, Context * context, HeightComputer heightComputer) {
|
ExpiringPointer<Calculation> CalculationStore::push(const char * text, Context * context, HeightComputer heightComputer) {
|
||||||
|
emptyTrash();
|
||||||
/* Compute ans now, before the buffer is updated and before the calculation
|
/* Compute ans now, before the buffer is updated and before the calculation
|
||||||
* might be deleted */
|
* might be deleted */
|
||||||
Expression ans = ansExpression(context);
|
Expression ans = ansExpression(context);
|
||||||
|
|
||||||
/* Prepare the buffer for the new calculation
|
/* 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 */
|
* 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 *);
|
int minSize = Calculation::MinimalSize() + sizeof(Calculation *);
|
||||||
assert(m_bufferSize > minSize);
|
assert(m_bufferSize > minSize);
|
||||||
while (remainingBufferSize() < minSize) {
|
while (remainingBufferSize() < minSize) {
|
||||||
@@ -100,9 +173,9 @@ ExpiringPointer<Calculation> CalculationStore::push(const char * text, Context *
|
|||||||
numberOfSignificantDigits = Poincare::Preferences::sharedPreferences()->numberOfSignificantDigits();
|
numberOfSignificantDigits = Poincare::Preferences::sharedPreferences()->numberOfSignificantDigits();
|
||||||
}
|
}
|
||||||
if (!pushSerializeExpression(outputs[i], beginingOfFreeSpace, &endOfFreeSpace, numberOfSignificantDigits)) {
|
if (!pushSerializeExpression(outputs[i], beginingOfFreeSpace, &endOfFreeSpace, numberOfSignificantDigits)) {
|
||||||
/* If the exat/approximate output does not fit in the store (event if the
|
/* If the exact/approximate output does not fit in the store (event if the
|
||||||
* current calculation is the only calculation), replace the output with
|
* current calculation is the only calculation), replace the output with
|
||||||
* undef if it fits, else replace the whole calcualtion with undef. */
|
* undef if it fits, else replace the whole calculation with undef. */
|
||||||
Expression undef = Undefined::Builder();
|
Expression undef = Undefined::Builder();
|
||||||
if (!pushSerializeExpression(undef, beginingOfFreeSpace, &endOfFreeSpace)) {
|
if (!pushSerializeExpression(undef, beginingOfFreeSpace, &endOfFreeSpace)) {
|
||||||
return emptyStoreAndPushUndef(context, heightComputer);
|
return emptyStoreAndPushUndef(context, heightComputer);
|
||||||
@@ -132,15 +205,23 @@ ExpiringPointer<Calculation> CalculationStore::push(const char * text, Context *
|
|||||||
|
|
||||||
// Delete the calculation of index i
|
// Delete the calculation of index i
|
||||||
void CalculationStore::deleteCalculationAtIndex(int i) {
|
void CalculationStore::deleteCalculationAtIndex(int i) {
|
||||||
|
if (m_trashIndex != -1) {
|
||||||
|
emptyTrash();
|
||||||
|
}
|
||||||
|
m_trashIndex = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete the calculation of index i, internal algorithm
|
||||||
|
void CalculationStore::realDeleteCalculationAtIndex(int i) {
|
||||||
assert(i >= 0 && i < m_numberOfCalculations);
|
assert(i >= 0 && i < m_numberOfCalculations);
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
ExpiringPointer<Calculation> lastCalculationPointer = calculationAtIndex(0);
|
ExpiringPointer<Calculation> lastCalculationPointer = realCalculationAtIndex(0);
|
||||||
m_calculationAreaEnd = (char *)(lastCalculationPointer.pointer());
|
m_calculationAreaEnd = (char *)(lastCalculationPointer.pointer());
|
||||||
m_numberOfCalculations--;
|
m_numberOfCalculations--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
char * calcI = (char *)calculationAtIndex(i).pointer();
|
char * calcI = (char *)realCalculationAtIndex(i).pointer();
|
||||||
char * nextCalc = (char *) calculationAtIndex(i-1).pointer();
|
char * nextCalc = (char *) realCalculationAtIndex(i-1).pointer();
|
||||||
assert(m_calculationAreaEnd >= nextCalc);
|
assert(m_calculationAreaEnd >= nextCalc);
|
||||||
size_t slidingSize = m_calculationAreaEnd - nextCalc;
|
size_t slidingSize = m_calculationAreaEnd - nextCalc;
|
||||||
// Slide the i-1 most recent calculations right after the i+1'th
|
// Slide the i-1 most recent calculations right after the i+1'th
|
||||||
@@ -154,13 +235,14 @@ void CalculationStore::deleteCalculationAtIndex(int i) {
|
|||||||
// Delete the oldest calculation in the store and returns the amount of space freed by the operation
|
// Delete the oldest calculation in the store and returns the amount of space freed by the operation
|
||||||
size_t CalculationStore::deleteOldestCalculation() {
|
size_t CalculationStore::deleteOldestCalculation() {
|
||||||
char * oldBufferEnd = (char *) m_calculationAreaEnd;
|
char * oldBufferEnd = (char *) m_calculationAreaEnd;
|
||||||
deleteCalculationAtIndex(numberOfCalculations()-1);
|
realDeleteCalculationAtIndex(numberOfCalculations()-1);
|
||||||
char * newBufferEnd = (char *) m_calculationAreaEnd;
|
char * newBufferEnd = (char *) m_calculationAreaEnd;
|
||||||
return oldBufferEnd - newBufferEnd;
|
return oldBufferEnd - newBufferEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete all calculations
|
// Delete all calculations
|
||||||
void CalculationStore::deleteAll() {
|
void CalculationStore::deleteAll() {
|
||||||
|
m_trashIndex = -1;
|
||||||
m_calculationAreaEnd = m_buffer;
|
m_calculationAreaEnd = m_buffer;
|
||||||
m_numberOfCalculations = 0;
|
m_numberOfCalculations = 0;
|
||||||
}
|
}
|
||||||
@@ -177,8 +259,8 @@ Expression CalculationStore::ansExpression(Context * context) {
|
|||||||
* parsed), ans is replaced by the approximation output when any Store or
|
* parsed), ans is replaced by the approximation output when any Store or
|
||||||
* Equal expression appears. */
|
* Equal expression appears. */
|
||||||
Expression e = mostRecentCalculation->exactOutput();
|
Expression e = mostRecentCalculation->exactOutput();
|
||||||
bool exactOuptutInvolvesStoreEqual = e.type() == ExpressionNode::Type::Store || e.type() == ExpressionNode::Type::Equal;
|
bool exactOutputInvolvesStoreEqual = e.type() == ExpressionNode::Type::Store || e.type() == ExpressionNode::Type::Equal;
|
||||||
if (mostRecentCalculation->input().recursivelyMatches(Expression::IsApproximate, context) || exactOuptutInvolvesStoreEqual) {
|
if (mostRecentCalculation->input().recursivelyMatches(Expression::IsApproximate, context) || exactOutputInvolvesStoreEqual) {
|
||||||
return mostRecentCalculation->approximateOutput(context, Calculation::NumberOfSignificantDigits::Maximal);
|
return mostRecentCalculation->approximateOutput(context, Calculation::NumberOfSignificantDigits::Maximal);
|
||||||
}
|
}
|
||||||
return mostRecentCalculation->exactOutput();
|
return mostRecentCalculation->exactOutput();
|
||||||
@@ -200,6 +282,12 @@ bool CalculationStore::pushSerializeExpression(Expression e, char * location, ch
|
|||||||
return expressionIsPushed;
|
return expressionIsPushed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CalculationStore::emptyTrash() {
|
||||||
|
if (m_trashIndex != -1) {
|
||||||
|
realDeleteCalculationAtIndex(m_trashIndex);
|
||||||
|
m_trashIndex = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Shared::ExpiringPointer<Calculation> CalculationStore::emptyStoreAndPushUndef(Context * context, HeightComputer heightComputer) {
|
Shared::ExpiringPointer<Calculation> CalculationStore::emptyStoreAndPushUndef(Context * context, HeightComputer heightComputer) {
|
||||||
@@ -213,7 +301,7 @@ Shared::ExpiringPointer<Calculation> CalculationStore::emptyStoreAndPushUndef(Co
|
|||||||
void CalculationStore::recomputeMemoizedPointersAfterCalculationIndex(int index) {
|
void CalculationStore::recomputeMemoizedPointersAfterCalculationIndex(int index) {
|
||||||
assert(index < m_numberOfCalculations);
|
assert(index < m_numberOfCalculations);
|
||||||
// Clear pointer and recompute new ones
|
// Clear pointer and recompute new ones
|
||||||
Calculation * c = calculationAtIndex(index).pointer();
|
Calculation * c = realCalculationAtIndex(index).pointer();
|
||||||
Calculation * nextCalc;
|
Calculation * nextCalc;
|
||||||
while (index != 0) {
|
while (index != 0) {
|
||||||
nextCalc = c->next();
|
nextCalc = c->next();
|
||||||
|
|||||||
@@ -41,11 +41,15 @@ public:
|
|||||||
void deleteCalculationAtIndex(int i);
|
void deleteCalculationAtIndex(int i);
|
||||||
void deleteAll();
|
void deleteAll();
|
||||||
int remainingBufferSize() const { assert(m_calculationAreaEnd >= m_buffer); return m_bufferSize - (m_calculationAreaEnd - m_buffer) - m_numberOfCalculations*sizeof(Calculation*); }
|
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; }
|
int numberOfCalculations() const { return m_numberOfCalculations - (m_trashIndex != -1); }
|
||||||
Poincare::Expression ansExpression(Poincare::Context * context);
|
Poincare::Expression ansExpression(Poincare::Context * context);
|
||||||
int bufferSize() { return m_bufferSize; }
|
int bufferSize() { return m_bufferSize; }
|
||||||
|
void reinsertTrash() { m_trashIndex = -1; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void emptyTrash();
|
||||||
|
Shared::ExpiringPointer<Calculation> realCalculationAtIndex(int i);
|
||||||
|
void realDeleteCalculationAtIndex(int i);
|
||||||
|
|
||||||
class CalculationIterator {
|
class CalculationIterator {
|
||||||
public:
|
public:
|
||||||
@@ -70,6 +74,7 @@ private:
|
|||||||
int m_bufferSize;
|
int m_bufferSize;
|
||||||
const char * m_calculationAreaEnd;
|
const char * m_calculationAreaEnd;
|
||||||
int m_numberOfCalculations;
|
int m_numberOfCalculations;
|
||||||
|
int m_trashIndex;
|
||||||
|
|
||||||
size_t deleteOldestCalculation();
|
size_t deleteOldestCalculation();
|
||||||
char * addressOfPointerToCalculationOfIndex(int i) {return m_buffer + m_bufferSize - (m_numberOfCalculations - i)*sizeof(Calculation *);}
|
char * addressOfPointerToCalculationOfIndex(int i) {return m_buffer + m_bufferSize - (m_numberOfCalculations - i)*sizeof(Calculation *);}
|
||||||
|
|||||||
@@ -68,6 +68,15 @@ void EditExpressionController::memoizeInput() {
|
|||||||
*m_cacheBufferInformation = m_contentView.expressionField()->moveCursorAndDumpContent(m_cacheBuffer, k_cacheBufferSize);
|
*m_cacheBufferInformation = m_contentView.expressionField()->moveCursorAndDumpContent(m_cacheBuffer, k_cacheBufferSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EditExpressionController::handleEvent(Ion::Events::Event event) {
|
||||||
|
if (event == Ion::Events::ShiftBack) {
|
||||||
|
m_historyController->reinsertTrash();
|
||||||
|
m_historyController->reload();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void EditExpressionController::viewWillAppear() {
|
void EditExpressionController::viewWillAppear() {
|
||||||
m_historyController->viewWillAppear();
|
m_historyController->viewWillAppear();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ public:
|
|||||||
void insertTextBody(const char * text);
|
void insertTextBody(const char * text);
|
||||||
void restoreInput();
|
void restoreInput();
|
||||||
void memoizeInput();
|
void memoizeInput();
|
||||||
|
bool handleEvent(Ion::Events::Event event) override;
|
||||||
|
|
||||||
/* TextFieldDelegate */
|
/* TextFieldDelegate */
|
||||||
bool textFieldDidReceiveEvent(::TextField * textField, Ion::Events::Event event) override;
|
bool textFieldDidReceiveEvent(::TextField * textField, Ion::Events::Event event) override;
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
#include "expression_field.h"
|
#include "expression_field.h"
|
||||||
#include <poincare/symbol.h>
|
#include <poincare/symbol.h>
|
||||||
|
#include <poincare/horizontal_layout.h>
|
||||||
|
#include <poincare/code_point_layout.h>
|
||||||
|
|
||||||
|
using namespace Poincare;
|
||||||
namespace Calculation {
|
namespace Calculation {
|
||||||
|
|
||||||
bool ExpressionField::handleEvent(Ion::Events::Event event) {
|
bool ExpressionField::handleEvent(Ion::Events::Event event) {
|
||||||
@@ -21,7 +24,30 @@ bool ExpressionField::handleEvent(Ion::Events::Event event) {
|
|||||||
event == Ion::Events::EE)) {
|
event == Ion::Events::EE)) {
|
||||||
handleEventWithText(Poincare::Symbol::k_ans);
|
handleEventWithText(Poincare::Symbol::k_ans);
|
||||||
}
|
}
|
||||||
return(::ExpressionField::handleEvent(event));
|
if (event == Ion::Events::Minus
|
||||||
|
&& isEditing()
|
||||||
|
&& fieldHasOnlyAMinus()) {
|
||||||
|
setText(Poincare::Symbol::k_ans);
|
||||||
|
}
|
||||||
|
return (::ExpressionField::handleEvent(event));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExpressionField::fieldHasOnlyAMinus() const {
|
||||||
|
if (editionIsInTextField()) {
|
||||||
|
const char *inputBuffer = m_textField.draftTextBuffer();
|
||||||
|
return (inputBuffer[0] == '-' && inputBuffer[1] == '\0');
|
||||||
|
}
|
||||||
|
Layout layout = m_layoutField.layout();
|
||||||
|
if (layout.type() == LayoutNode::Type::HorizontalLayout && layout.numberOfChildren() == 1) {
|
||||||
|
Layout child = layout.childAtIndex(0);
|
||||||
|
if (child.type() == LayoutNode::Type::CodePointLayout) {
|
||||||
|
CodePointLayout &codePointLayout = static_cast<CodePointLayout &>(child);
|
||||||
|
if (codePointLayout.codePoint() == '-'){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ public:
|
|||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
bool handleEvent(Ion::Events::Event event) override;
|
bool handleEvent(Ion::Events::Event event) override;
|
||||||
|
private:
|
||||||
|
bool fieldHasOnlyAMinus() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ HistoryController::HistoryController(EditExpressionController * editExpressionCo
|
|||||||
m_complexController(editExpressionController),
|
m_complexController(editExpressionController),
|
||||||
m_integerController(editExpressionController),
|
m_integerController(editExpressionController),
|
||||||
m_rationalController(editExpressionController),
|
m_rationalController(editExpressionController),
|
||||||
|
m_secondDegreeController(editExpressionController),
|
||||||
m_trigonometryController(editExpressionController),
|
m_trigonometryController(editExpressionController),
|
||||||
m_unitController(editExpressionController),
|
m_unitController(editExpressionController),
|
||||||
m_matrixController(editExpressionController)
|
m_matrixController(editExpressionController)
|
||||||
@@ -100,12 +101,14 @@ bool HistoryController::handleEvent(Ion::Events::Event event) {
|
|||||||
Expression e = calculationAtIndex(focusRow)->exactOutput();
|
Expression e = calculationAtIndex(focusRow)->exactOutput();
|
||||||
if (additionalInfoType == Calculation::AdditionalInformationType::Complex) {
|
if (additionalInfoType == Calculation::AdditionalInformationType::Complex) {
|
||||||
vc = &m_complexController;
|
vc = &m_complexController;
|
||||||
} else if (additionalInfoType == Calculation::AdditionalInformationType::Trigonometry) {
|
} else if (additionalInfoType == Calculation::AdditionalInformationType::SecondDegree) {
|
||||||
|
vc = &m_secondDegreeController;
|
||||||
|
} else if (additionalInfoType == Calculation::AdditionalInformationType::TrigonometryInput) {
|
||||||
vc = &m_trigonometryController;
|
vc = &m_trigonometryController;
|
||||||
// Find which of the input or output is the cosine/sine
|
e = calculationAtIndex(focusRow)->input();
|
||||||
ExpressionNode::Type t = e.type();
|
} else if (additionalInfoType == Calculation::AdditionalInformationType::TrigonometryOutput) {
|
||||||
e = t == ExpressionNode::Type::Cosine || t == ExpressionNode::Type::Sine ? e : calculationAtIndex(focusRow)->input();
|
vc = &m_trigonometryController;
|
||||||
} else if (additionalInfoType == Calculation::AdditionalInformationType::Integer) {
|
} else if (additionalInfoType == Calculation::AdditionalInformationType::Integer) {
|
||||||
vc = &m_integerController;
|
vc = &m_integerController;
|
||||||
} else if (additionalInfoType == Calculation::AdditionalInformationType::Rational) {
|
} else if (additionalInfoType == Calculation::AdditionalInformationType::Rational) {
|
||||||
vc = &m_rationalController;
|
vc = &m_rationalController;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include "additional_outputs/complex_list_controller.h"
|
#include "additional_outputs/complex_list_controller.h"
|
||||||
#include "additional_outputs/integer_list_controller.h"
|
#include "additional_outputs/integer_list_controller.h"
|
||||||
#include "additional_outputs/rational_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/trigonometry_list_controller.h"
|
||||||
#include "additional_outputs/unit_list_controller.h"
|
#include "additional_outputs/unit_list_controller.h"
|
||||||
#include "additional_outputs/matrix_list_controller.h"
|
#include "additional_outputs/matrix_list_controller.h"
|
||||||
@@ -34,6 +35,7 @@ public:
|
|||||||
int typeAtLocation(int i, int j) override;
|
int typeAtLocation(int i, int j) override;
|
||||||
void setSelectedSubviewType(SubviewType subviewType, bool sameCell, int previousSelectedX = -1, int previousSelectedY = -1) override;
|
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;
|
void tableViewDidChangeSelectionAndDidScroll(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY, bool withinTemporarySelection = false) override;
|
||||||
|
void reinsertTrash() { m_calculationStore->reinsertTrash(); }
|
||||||
private:
|
private:
|
||||||
int storeIndex(int i) { return numberOfRows() - i - 1; }
|
int storeIndex(int i) { return numberOfRows() - i - 1; }
|
||||||
Shared::ExpiringPointer<Calculation> calculationAtIndex(int i);
|
Shared::ExpiringPointer<Calculation> calculationAtIndex(int i);
|
||||||
@@ -47,6 +49,7 @@ private:
|
|||||||
ComplexListController m_complexController;
|
ComplexListController m_complexController;
|
||||||
IntegerListController m_integerController;
|
IntegerListController m_integerController;
|
||||||
RationalListController m_rationalController;
|
RationalListController m_rationalController;
|
||||||
|
SecondDegreeListController m_secondDegreeController;
|
||||||
TrigonometryListController m_trigonometryController;
|
TrigonometryListController m_trigonometryController;
|
||||||
UnitListController m_unitController;
|
UnitListController m_unitController;
|
||||||
MatrixListController m_matrixController;
|
MatrixListController m_matrixController;
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ void HistoryViewCell::reloadSubviewHighlight() {
|
|||||||
m_ellipsis.setHighlighted(false);
|
m_ellipsis.setHighlighted(false);
|
||||||
if (isHighlighted()) {
|
if (isHighlighted()) {
|
||||||
if (m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Input) {
|
if (m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Input) {
|
||||||
m_inputView.setExpressionBackgroundColor(Palette::ListCellBackgroundSelected);
|
m_inputView.setExpressionBackgroundColor(Palette::Select);
|
||||||
} else if (m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Output) {
|
} else if (m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Output) {
|
||||||
m_scrollableOutputView.evenOddCell()->setHighlighted(true);
|
m_scrollableOutputView.evenOddCell()->setHighlighted(true);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
apps += Code::App
|
apps += Code::App
|
||||||
app_headers += apps/code/app.h
|
app_headers += apps/code/app.h
|
||||||
|
|
||||||
|
SFLAGS += -DHAS_CODE
|
||||||
|
|
||||||
app_code_src = $(addprefix apps/code/,\
|
app_code_src = $(addprefix apps/code/,\
|
||||||
app.cpp \
|
app.cpp \
|
||||||
console_controller.cpp \
|
console_controller.cpp \
|
||||||
@@ -30,6 +32,7 @@ app_code_test_src = $(addprefix apps/code/,\
|
|||||||
|
|
||||||
tests_src += $(addprefix apps/code/test/,\
|
tests_src += $(addprefix apps/code/test/,\
|
||||||
variable_box_controller.cpp\
|
variable_box_controller.cpp\
|
||||||
|
toolbox_ion_keys_dummy.cpp \
|
||||||
)
|
)
|
||||||
|
|
||||||
app_code_src += $(app_code_test_src)
|
app_code_src += $(app_code_test_src)
|
||||||
|
|||||||
@@ -3,6 +3,13 @@
|
|||||||
#include <apps/i18n.h>
|
#include <apps/i18n.h>
|
||||||
#include "helpers.h"
|
#include "helpers.h"
|
||||||
#include <ion/unicode/utf8_helper.h>
|
#include <ion/unicode/utf8_helper.h>
|
||||||
|
#include <apps/apps_container.h>
|
||||||
|
|
||||||
|
#if defined _FXCG || defined NSPIRE_NEWLIB
|
||||||
|
extern "C" int calculator;
|
||||||
|
extern "C" const int prizm_heap_size;
|
||||||
|
extern "C" char prizm_heap[];
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Code {
|
namespace Code {
|
||||||
|
|
||||||
@@ -124,15 +131,21 @@ Toolbox * App::toolboxForInputEventHandler(InputEventHandler * textInput) {
|
|||||||
return &m_toolbox;
|
return &m_toolbox;
|
||||||
}
|
}
|
||||||
|
|
||||||
Code::toolboxIonKeys * App::toolboxIonKeys() {
|
|
||||||
return &m_toolboxIonKeys;
|
|
||||||
}
|
|
||||||
|
|
||||||
VariableBoxController * App::variableBoxForInputEventHandler(InputEventHandler * textInput) {
|
VariableBoxController * App::variableBoxForInputEventHandler(InputEventHandler * textInput) {
|
||||||
return &m_variableBoxController;
|
return &m_variableBoxController;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool App::textInputDidReceiveEvent(InputEventHandler * textInput, Ion::Events::Event event) {
|
bool App::textInputDidReceiveEvent(InputEventHandler * textInput, Ion::Events::Event event) {
|
||||||
|
if (event == Ion::Events::XNT) {
|
||||||
|
int bufferSize = CodePoint::MaxCodePointCharLength + 1;
|
||||||
|
char buffer[bufferSize];
|
||||||
|
bool shouldRemoveLastCharacter = false;
|
||||||
|
CodePoint codePoint = AppsContainer::sharedAppsContainer()->XNT('x', &shouldRemoveLastCharacter);
|
||||||
|
UTF8Decoder::CodePointToChars(codePoint, buffer, bufferSize);
|
||||||
|
buffer[UTF8Decoder::CharSizeOfCodePoint(codePoint)] = 0;
|
||||||
|
textInput->handleEventWithText(const_cast<char *>(buffer), false, false, shouldRemoveLastCharacter);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
const char * pythonText = Helpers::PythonTextForEvent(event);
|
const char * pythonText = Helpers::PythonTextForEvent(event);
|
||||||
if (pythonText != nullptr) {
|
if (pythonText != nullptr) {
|
||||||
textInput->handleEventWithText(pythonText);
|
textInput->handleEventWithText(pythonText);
|
||||||
@@ -143,7 +156,17 @@ bool App::textInputDidReceiveEvent(InputEventHandler * textInput, Ion::Events::E
|
|||||||
|
|
||||||
void App::initPythonWithUser(const void * pythonUser) {
|
void App::initPythonWithUser(const void * pythonUser) {
|
||||||
if (!m_pythonUser) {
|
if (!m_pythonUser) {
|
||||||
MicroPython::init(m_pythonHeap, m_pythonHeap + k_pythonHeapSize);
|
#if defined _FXCG || defined NSPIRE_NEWLIB
|
||||||
|
if (calculator == 1) { // fxcg50
|
||||||
|
MicroPython::init( (void *) 0x8c200000, (void *)(0x8c200000+ 0x2e0000));
|
||||||
|
} else if (calculator >= 1 && calculator <=4 ) {
|
||||||
|
MicroPython::init( prizm_heap, prizm_heap+prizm_heap_size);
|
||||||
|
} else {
|
||||||
|
#endif
|
||||||
|
MicroPython::init(m_pythonHeap, m_pythonHeap + k_pythonHeapSize);
|
||||||
|
#if defined _FXCG || defined NSPIRE_NEWLIB
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
m_pythonUser = pythonUser;
|
m_pythonUser = pythonUser;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
#include "python_toolbox.h"
|
#include "python_toolbox.h"
|
||||||
#include "variable_box_controller.h"
|
#include "variable_box_controller.h"
|
||||||
#include "../shared/shared_app.h"
|
#include "../shared/shared_app.h"
|
||||||
#include "toolbox_ion_keys.h"
|
|
||||||
|
|
||||||
namespace Code {
|
namespace Code {
|
||||||
|
|
||||||
@@ -76,9 +75,7 @@ public:
|
|||||||
|
|
||||||
VariableBoxController * variableBoxController() { return &m_variableBoxController; }
|
VariableBoxController * variableBoxController() { return &m_variableBoxController; }
|
||||||
|
|
||||||
static constexpr int k_pythonHeapSize = 100000;
|
static constexpr int k_pythonHeapSize = 69500;
|
||||||
|
|
||||||
Code::toolboxIonKeys * toolboxIonKeys();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/* Python delegate:
|
/* Python delegate:
|
||||||
@@ -96,7 +93,6 @@ private:
|
|||||||
StackViewController m_codeStackViewController;
|
StackViewController m_codeStackViewController;
|
||||||
PythonToolbox m_toolbox;
|
PythonToolbox m_toolbox;
|
||||||
VariableBoxController m_variableBoxController;
|
VariableBoxController m_variableBoxController;
|
||||||
Code::toolboxIonKeys m_toolboxIonKeys;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
AddScript = "Skript hinzufügen"
|
AddScript = "Skript hinzufügen"
|
||||||
AllowedCharactersaz09 = "Erlaubte Zeichen: a-z, 0-9, _"
|
AllowedCharactersaz09 = "Erlaubte Zeichen: a-z, 0-9, _"
|
||||||
Autocomplete = "Autovervollständigung"
|
Autocomplete = "Autovervollständigung"
|
||||||
AutoImportScript = "Automatischer Import in Konsole"
|
AutoImportScript = "Automatischer Import in die Konsole"
|
||||||
BuiltinsAndKeywords = "Native Funktionen und Schlüsselwörter"
|
BuiltinsAndKeywords = "Native Funktionen & Schlüsselwörter"
|
||||||
Console = "Interaktive Konsole"
|
Console = "Interaktive Konsole"
|
||||||
DeleteScript = "Skript löschen"
|
DeleteScript = "Skript löschen"
|
||||||
DuplicateScript = "Skript duplizieren"
|
DuplicateScript = "Skript duplizieren"
|
||||||
ExecuteScript = "Skript ausführen"
|
ExecuteScript = "Skript ausführen"
|
||||||
FunctionsAndVariables = "Funktionen und Variablen"
|
FunctionsAndVariables = "Funktionen und Variablen"
|
||||||
ImportedModulesAndScripts = "Importierte Module und Skripte"
|
ImportedModulesAndScripts = "Importierte Module und Skripte"
|
||||||
NoWordAvailableHere = "Kein Wort ist hier verfübar."
|
NoWordAvailableHere = "Hier ist kein Wort verfügbar."
|
||||||
ScriptInProgress = "Aktuelle Skript"
|
ScriptInProgress = "Aktuelles Skript"
|
||||||
ScriptOptions = "Skriptoptionen"
|
ScriptOptions = "Skriptoptionen"
|
||||||
ScriptSize = "Script size"
|
ScriptSize = "Skriptgröße"
|
||||||
|
|||||||
@@ -1,3 +1,2 @@
|
|||||||
CodeAppCapital = "PYTHON"
|
CodeAppCapital = "PYTHON"
|
||||||
ConsolePrompt = ">>> "
|
ConsolePrompt = ">>> "
|
||||||
ScriptParameters = "..."
|
|
||||||
|
|||||||
@@ -1,177 +1,265 @@
|
|||||||
PythonPound = "Kommentar"
|
PythonPound = "Kommentar"
|
||||||
PythonPercent = "Modulo"
|
PythonPercent = "Modulo"
|
||||||
|
PythonColon = "Doppelpunkt"
|
||||||
|
PythonSemicon = "Semikolon"
|
||||||
|
PythonExclamationMark = "Ausrufezeichen"
|
||||||
|
PythonLessThan = "Kleiner als"
|
||||||
|
PythonGreaterThan = "Größer als"
|
||||||
|
PythonQuestionMark = "Fragezeichen"
|
||||||
Python1J = "Imaginäres i"
|
Python1J = "Imaginäres i"
|
||||||
PythonLF = "Zeilenvorschub"
|
PythonLF = "Zeilenvorschub"
|
||||||
PythonTab = "Tabulator"
|
PythonTab = "Tabulator"
|
||||||
PythonAmpersand = "Bitweise und"
|
PythonAmpersand = "Bitweises und"
|
||||||
PythonSymbolExp = "Bitweise exklusiv oder"
|
PythonSymbolExp = "Bitweises exklusives oder"
|
||||||
PythonVerticalBar = "Bitweise oder"
|
PythonVerticalBar = "Bitweises oder"
|
||||||
PythonImag = "Imaginärteil von z"
|
PythonImag = "Imaginärteil von z"
|
||||||
PythonReal = "Realteil von z"
|
PythonReal = "Realteil von z"
|
||||||
PythonSingleQuote = "Einfaches Anführungszeichen"
|
PythonSingleQuote = "Einfaches Anführungszeichen"
|
||||||
PythonAbs = "Absolute/r Wert/Größe"
|
PythonAbs = "Absoluter Wert/Absolute Größe"
|
||||||
PythonAcos = "Arkuskosinus"
|
PythonAcos = "Bogenkosinus"
|
||||||
PythonAcosh = "Hyperbelkosinus"
|
PythonAcosh = "Bogenhyperbolischer Kosinus"
|
||||||
PythonAppend = "Hängt x an das Ende der Liste"
|
PythonAppend = "x an das Ende der Liste anfügen"
|
||||||
PythonArrow = "Arrow from (x,y) to (x+dx,y+dy)"
|
PythonArrow = "Pfeil von (x,y) nach (x+dx,y+dy)"
|
||||||
PythonAsin = "Arkussinus"
|
PythonAsin = "Sinusbogen"
|
||||||
PythonAsinh = "Hyperbelsinus"
|
PythonAsinh = "Kreisbogen hyperbolischer Sinus"
|
||||||
PythonAtan = "Arkustangens"
|
PythonAtan = "Arkustangens"
|
||||||
PythonAtan2 = "Gib atan(y/x)"
|
PythonAtan2 = "Rückgabe atan(y/x)"
|
||||||
PythonAtanh = "Hyperbeltangens"
|
PythonAtanh = "Hyperbeltangens"
|
||||||
PythonAxis = "Set axes to (xmin,xmax,ymin,ymax)"
|
PythonAxis = "Achsen auf (xmin,xmax,ymin,ymax)"
|
||||||
PythonBar = "Draw a bar plot with x values"
|
PythonBar = "Balkendiagramm mit x-Werten"
|
||||||
PythonBin = "Ganzzahl nach binär konvertieren"
|
PythonBin = "Ganzzahl in Binärwert umwandeln"
|
||||||
PythonCeil = "Aufrundung"
|
PythonCeil = "Aufrunden"
|
||||||
PythonChoice = "Zufallszahl aus der Liste"
|
PythonChoice = "Zufällige Zahl in der Liste"
|
||||||
PythonClear = "Leere die Liste"
|
PythonClear = "Liste leeren"
|
||||||
PythonCmathFunction = "cmath-Modul-Funktionspräfix"
|
PythonCmathFunction = "cmath-Modul-Funktionspräfix"
|
||||||
PythonColor = "Definiere eine RGB-Farbe"
|
PythonColor = "Eine RGB-Farbe definieren"
|
||||||
PythonColorBlack = "Black color"
|
PythonColorBlack = "Farbe Schwarz"
|
||||||
PythonColorBlue = "Blue color"
|
PythonColorBlue = "Farbe Blau"
|
||||||
PythonColorBrown = "Brown color"
|
PythonColorBrown = "Farbe Braun"
|
||||||
PythonColorGray = "Gray color"
|
PythonColorGray = "Farbe Grau"
|
||||||
PythonColorGreen = "Green color"
|
PythonColorGreen = "Farbe Grün"
|
||||||
PythonColorOrange = "Orange color"
|
PythonColorOrange = "Farbe Orange"
|
||||||
PythonColorPink = "Pink color"
|
PythonColorPink = "Farbe Rosa"
|
||||||
PythonColorPurple = "Purple color"
|
PythonColorPurple = "Farbe Violett"
|
||||||
PythonColorRed = "Red color"
|
PythonColorRed = "Farbe Rot"
|
||||||
PythonColorWhite = "White color"
|
PythonColorWhite = "Farbe Weiß"
|
||||||
PythonColorYellow = "Yellow color"
|
PythonColorYellow = "Farbe Gelb"
|
||||||
PythonComplex = "a+ib zurückgeben"
|
PythonComplex = "Gib a+ib zurück"
|
||||||
PythonCopySign = "x mit dem Vorzeichen von y"
|
PythonCopySign = "Gib x mit Vorzeichen von y zurück"
|
||||||
PythonCos = "Kosinus"
|
PythonCos = "Kosinus"
|
||||||
PythonCosh = "Hyperbolic cosine"
|
PythonCosh = "Hyperbolischer Kosinus"
|
||||||
PythonCount = "Zählt wie oft x vorkommt"
|
PythonCount = "Zählt die Vorkommen von x"
|
||||||
PythonDegrees = "x von Radian zu Grad umwandeln"
|
PythonDegrees = "x von Bogenmaß in Grad umrechnen"
|
||||||
PythonDivMod = "Quotient und Rest"
|
PythonDivMod = "Quotient und Rest"
|
||||||
PythonDrawLine = "Draw a line"
|
PythonDrawCircle = "Zeichne einen Kreis"
|
||||||
PythonDrawString = "Schreibt Text bei (x,y)"
|
PythonDrawLine = "Eine Linie zeichnen"
|
||||||
|
PythonDrawString = "Text bei Pixel (x,y) darstellen"
|
||||||
PythonErf = "Fehlerfunktion"
|
PythonErf = "Fehlerfunktion"
|
||||||
PythonErfc = "Complementary error function"
|
PythonErfc = "Komplementäre Fehlerfunktion"
|
||||||
PythonEval = "Return the evaluated expression"
|
PythonEval = "Rückgabe ausgewerteter Ausdruck"
|
||||||
PythonExp = "Exponentialfunktion"
|
PythonExp = "Exponentialfunktion"
|
||||||
PythonExpm1 = "Berechne exp(x)-1"
|
PythonExpm1 = "Berechne exp(x)-1"
|
||||||
|
PythonFactorial = "Fakultät von x"
|
||||||
PythonFabs = "Absoluter Wert"
|
PythonFabs = "Absoluter Wert"
|
||||||
PythonFillRect = "Malt ein Rechteck bei Pixel (x,y)"
|
PythonFillRect = "Gefülltes Rechteck bei Pixel (x,y)"
|
||||||
PythonFloat = "Wandelt x zu float um"
|
PythonFillCircle = "Füllt einen Kreis"
|
||||||
PythonFloor = "Floor"
|
PythonFillPolygon = "Füllt ein Polygon"
|
||||||
|
PythonFloat = "x in einen Fließkommawert umwandeln"
|
||||||
|
PythonFloor = "Abrunden"
|
||||||
PythonFmod = "a modulo b"
|
PythonFmod = "a modulo b"
|
||||||
PythonFrExp = "Mantissa and exponent of x: (m,e)"
|
PythonFrExp = "Mantisse und Exponent von x: (m,e)"
|
||||||
PythonGamma = "Gamma function"
|
PythonGamma = "Gamma-Funktion"
|
||||||
PythonGetPixel = "Return pixel (x,y) color"
|
PythonGetKeys = "Gedrückte Tasten erhalten"
|
||||||
PythonGetrandbits = "Integer with k random bits"
|
PythonGetPalette = "Themenpalette erhalten"
|
||||||
PythonGrid = "Toggle the visibility of the grid"
|
PythonGetPixel = "Farbe von Pixel (x,y) zurückgeben"
|
||||||
PythonHex = "Ganzzahl zu Hexadecimal"
|
PythonGetrandbits = "Ganzzahl mit k Zufallsbits"
|
||||||
PythonHist = "Draw the histogram of x"
|
PythonGrid = "Sichtbarkeit des Gitters umschalten"
|
||||||
PythonImportCmath = "cmath Modul importieren"
|
PythonHex = "Ganzzahl in Hexadezimal umwandeln"
|
||||||
PythonImportIon = "ion Modul importieren"
|
PythonHist = "Zeichnet das Histogramm von x"
|
||||||
PythonImportKandinsky = "kandinsky Modul importieren"
|
PythonImportCmath = "cmath-Modul importieren"
|
||||||
PythonImportRandom = "random Modul importieren"
|
PythonImportIon = "Ion-Modul importieren"
|
||||||
PythonImportMath = "math Modul importieren"
|
PythonImportKandinsky = "Kandinsky-Modul importieren"
|
||||||
PythonImportMatplotlibPyplot = "Import matplotlib.pyplot module"
|
PythonImportRandom = "Random-Modul importieren"
|
||||||
PythonImportOs = "os Modul importieren"
|
PythonImportMath = "Math-Modul importieren"
|
||||||
PythonOsUname = "Informieren Sie sich über das System"
|
PythonImportMatplotlibPyplot = "Matplotlib.pyplot-Modul importieren"
|
||||||
|
PythonImportNumpy = "Ulab.numpy-Modul importieren"
|
||||||
|
PythonImportScipy = "Ulab.scipy-Modul importieren"
|
||||||
|
PythonImportOs = "OS-Modul importieren"
|
||||||
|
PythonImportSys = "SYS-Modul importieren"
|
||||||
|
PythonOsUname = "Informationen über das System holen"
|
||||||
|
PythonOsGetlogin = "Benutzernamen holen"
|
||||||
PythonOsRemove = "Datei namens Dateiname entfernen"
|
PythonOsRemove = "Datei namens Dateiname entfernen"
|
||||||
PythonOsRename = "Datei mit altem Namen in neuen Namen umbenennen"
|
PythonOsRename = "Datei umbenennen von Alt nach Neu"
|
||||||
PythonOsListdir = "Dateien im Speicher auflisten"
|
PythonOsListdir = "Dateien im Speicher auflisten"
|
||||||
PythonImportTime = "time Modul importieren"
|
PythonSysExit = "Terminate current program"
|
||||||
PythonImportTurtle = "turtle Modul importieren"
|
PythonSysPrintexception = "Print exception"
|
||||||
PythonIndex = "Index, bei dem x zuerst vorkommt"
|
PythonSysByteorder = "The byte order of the system"
|
||||||
PythonInput = "Eingabeaufforderung"
|
PythonSysImplementation = "Information about Python"
|
||||||
PythonInsert = "x bei index i in der Liste einsetzen"
|
PythonSysModules = "Dictionary of loaded modules"
|
||||||
PythonInt = "x zu Ganzzahl"
|
PythonSysVersion = "Python language version (string)"
|
||||||
PythonIonFunction = "ion module function prefix"
|
PythonSysVersioninfo = "Python language version (tuple)"
|
||||||
PythonIsFinite = "Prüft ob x endlich ist"
|
PythonImportTime = "Time-Modul importieren"
|
||||||
PythonIsInfinite = "Prüft ob x unendlich ist"
|
PythonImportTurtle = "Turtle-Modul importieren"
|
||||||
PythonIsNaN = "Prüft ob x NaN ist"
|
PythonIndex = "Index des ersten x-Vorkommens"
|
||||||
PythonIsKeyDown = "true wenn k gedrückt ist"
|
PythonInput = "Einen Wert abfragen"
|
||||||
PythonKandinskyFunction = "kandinsky module function prefix"
|
PythonInsert = "x an Index i in die Liste einfügen"
|
||||||
PythonLdexp = "Return x*(2**i), inverse of frexp"
|
PythonInt = "x in eine ganze Zahl umwandeln"
|
||||||
PythonLength = "Length of an object"
|
PythonIonFunction = "Ion-Modul-Funktionspräfix"
|
||||||
PythonLgamma = "Log-gamma function"
|
PythonIsFinite = "Prüfen, ob x endlich ist"
|
||||||
PythonLog = "Logarithm to base a"
|
PythonIsInfinite = "Prüfen, ob x unendlich ist"
|
||||||
PythonLog10 = "Logarithm to base 10"
|
PythonIsNaN = "Prüfen, ob x keine Zahl ist"
|
||||||
PythonLog2 = "Logarithm to base 2"
|
PythonIsKeyDown = "Wahr, wenn die Taste k gedrückt ist"
|
||||||
PythonMathFunction = "math module function prefix"
|
PythonBattery = "Rückgabe der Batteriespannung"
|
||||||
PythonMatplotlibPyplotFunction = "matplotlib.pyplot module prefix"
|
PythonBatteryLevel = "Gibt den Batteriestand zurück"
|
||||||
|
PythonBatteryIscharging = "Gibt zurück, ob die Batterie geladen wird"
|
||||||
|
PythonSetBrightness = "Helligkeitsstufe festlegen"
|
||||||
|
PythonGetBrightness = "Helligkeitsstufe abrufen"
|
||||||
|
PythonKandinskyFunction = "Kandinsky-Modul Funktionspräfix"
|
||||||
|
PythonKeyLeft = "LEFT ARROW key"
|
||||||
|
PythonKeyUp = "UP ARROW key"
|
||||||
|
PythonKeyDown = "DOWN ARROW key"
|
||||||
|
PythonKeyRight = "RIGHT ARROW key"
|
||||||
|
PythonKeyOk = "OK key"
|
||||||
|
PythonKeyBack = "BACK key"
|
||||||
|
PythonKeyHome = "HOME key"
|
||||||
|
PythonKeyOnOff = "ON/OFF key"
|
||||||
|
PythonKeyShift = "SHIFT key"
|
||||||
|
PythonKeyAlpha = "ALPHA key"
|
||||||
|
PythonKeyXnt = "X,N,T key"
|
||||||
|
PythonKeyVar = "VAR key"
|
||||||
|
PythonKeyToolbox = "TOOLBOX key"
|
||||||
|
PythonKeyBackspace = "BACKSPACE key"
|
||||||
|
PythonKeyExp = "EXPONENTIAL key"
|
||||||
|
PythonKeyLn = "NATURAL LOGARITHM key"
|
||||||
|
PythonKeyLog = "DECIMAL LOGARITHM key"
|
||||||
|
PythonKeyImaginary = "IMAGINARY I key"
|
||||||
|
PythonKeyComma = "COMMA key"
|
||||||
|
PythonKeyPower = "POWER key"
|
||||||
|
PythonKeySine = "SINE key"
|
||||||
|
PythonKeyCosine = "COSINE key"
|
||||||
|
PythonKeyTangent = "TANGENT key"
|
||||||
|
PythonKeyPi = "PI key"
|
||||||
|
PythonKeySqrt = "SQUARE ROOT key"
|
||||||
|
PythonKeySquare = "SQUARE key"
|
||||||
|
PythonKeySeven = "7 key"
|
||||||
|
PythonKeyEight = "8 key"
|
||||||
|
PythonKeyNine = "9 key"
|
||||||
|
PythonKeyLeftParenthesis = "LEFT PARENTHESIS key"
|
||||||
|
PythonKeyRightParenthesis = "RIGHT PARENTHESIS key"
|
||||||
|
PythonKeyFour = "4 key"
|
||||||
|
PythonKeyFive = "5 key"
|
||||||
|
PythonKeySix = "6 key"
|
||||||
|
PythonKeyMultiplication = "MULTIPLICATION key"
|
||||||
|
PythonKeyDivision = "DIVISION key"
|
||||||
|
PythonKeyOne = "1 key"
|
||||||
|
PythonKeyTwo = "2 key"
|
||||||
|
PythonKeyThree = "3 key"
|
||||||
|
PythonKeyPlus = "PLUS key"
|
||||||
|
PythonKeyMinus = "MINUS key"
|
||||||
|
PythonKeyZero = "0 key"
|
||||||
|
PythonKeyDot = "DOT key"
|
||||||
|
PythonKeyEe = "10 POWER X key"
|
||||||
|
PythonKeyAns = "ANS key"
|
||||||
|
PythonKeyExe = "EXE key"
|
||||||
|
PythonLdexp = "Liefert x*(2**i), Inverse von frexp"
|
||||||
|
PythonLength = "Länge eines Objekts"
|
||||||
|
PythonLgamma = "Log-Gamma-Funktion"
|
||||||
|
PythonLog = "Logarithmus zur Basis a"
|
||||||
|
PythonLog10 = "Logarithmus zur Basis 10"
|
||||||
|
PythonLog2 = "Logarithmus zur Basis 2"
|
||||||
|
PythonMathFunction = "Funktionspräfix des Math-Moduls"
|
||||||
|
PythonMatplotlibPyplotFunction = "matplotlib.pyplot Modul-Präfix"
|
||||||
PythonMax = "Maximum"
|
PythonMax = "Maximum"
|
||||||
PythonMin = "Minimum"
|
PythonMin = "Minimum"
|
||||||
PythonModf = "Fractional and integer parts of x"
|
PythonModf = "Bruch- und Ganzzahl-Anteile von x"
|
||||||
PythonMonotonic = "Value of a monotonic clock"
|
PythonMonotonic = "Wert einer monotonen Uhr"
|
||||||
PythonOct = "Convert integer to octal"
|
PythonNumpyFunction = "numpy Modul-Präfix"
|
||||||
PythonPhase = "Phase of z"
|
PythonNumpyFftFunction = "numpy.fft Modul-Präfix"
|
||||||
PythonPlot = "Plot y versus x as lines"
|
PythonNumpyLinalgFunction = "numpy.linalg Modul-Präfix"
|
||||||
PythonPolar = "z in polar coordinates"
|
PythonScipyFunction = "scipy Modul-Präfix"
|
||||||
PythonPop = "Remove and return the last item"
|
PythonScipyLinalgFunction = "scipy.linalg Modul-Präfix"
|
||||||
PythonPower = "x raised to the power y"
|
PythonScipyOptimizeFunction = "scipy.optimize Modul-Präfix"
|
||||||
PythonPrint = "Print object"
|
PythonScipySignalFunction = "scipy.signal Modul-Präfix"
|
||||||
PythonRadians = "Convert x from degrees to radians"
|
PythonScipySpecialFunction = "scipy.special Modul-Präfix"
|
||||||
PythonRandint = "Random integer in [a,b]"
|
PythonOct = "Ganzzahl in Oktal umwandeln"
|
||||||
PythonRandom = "Floating point number in [0,1["
|
PythonPhase = "Phase von z"
|
||||||
PythonRandomFunction = "random module function prefix"
|
PythonPlot = "Plotten von y gegen x als Linien"
|
||||||
PythonRandrange = "Random number in range(start,stop)"
|
PythonPolar = "z in Polarkoordinaten"
|
||||||
PythonRangeStartStop = "List from start to stop-1"
|
PythonPop = "Letztes Element abnehmen"
|
||||||
PythonRangeStop = "List from 0 to stop-1"
|
PythonPower = "x erhöht mit der Potenz y"
|
||||||
PythonRect = "Convert to cartesian coordinates"
|
PythonPrint = "Objekt drucken"
|
||||||
PythonRemove = "Remove the first occurrence of x"
|
PythonRadians = "x von Grad in Bogenmaß umrechnen"
|
||||||
PythonReverse = "Reverse the elements of the list"
|
PythonRandint = "Zufällige Ganzzahl in [a,b]"
|
||||||
PythonRound = "Round to n digits"
|
PythonRandom = "Fließkommazahl in [0,1]"
|
||||||
PythonScatter = "Draw a scatter plot of y versus x"
|
PythonRandomFunction = "Random-Modul Funktionspräfix"
|
||||||
PythonSeed = "Initialize random number generator"
|
PythonRandrange = "Zufallszahl im Bereich(start,stop)"
|
||||||
PythonSetPixel = "Color pixel (x,y)"
|
PythonRangeStartStop = "Liste von Start bis Stop-1"
|
||||||
PythonShow = "Display the figure"
|
PythonRangeStop = "Liste von 0 bis Stop-1"
|
||||||
PythonSin = "Sine"
|
PythonRect = "In kartesische Koordinaten"
|
||||||
PythonSinh = "Hyperbolic sine"
|
PythonRemove = "Entferne das erste Vorkommen von x"
|
||||||
PythonSleep = "Suspend the execution for t seconds"
|
PythonReverse = "Kehrt die Elemente der Liste um"
|
||||||
PythonSort = "Sort the list"
|
PythonRound = "Runden auf n Stellen"
|
||||||
PythonSqrt = "Wurzel"
|
PythonScatter = "Streudiagramm von y gg. x zeichnen"
|
||||||
PythonSum = "Sum the items of a list"
|
PythonSeed = "Zufallszahlengenerator initiieren"
|
||||||
|
PythonSetPixel = "Pixel (x,y) einfärben"
|
||||||
|
PythonShow = "Figur anzeigen"
|
||||||
|
PythonSin = "Sinus"
|
||||||
|
PythonSinh = "Hyperbolischer Sinus"
|
||||||
|
PythonSleep = "Ausführung aussetzen für t Sekunden"
|
||||||
|
PythonLocalTime = "Zeit in Tupel umwandeln"
|
||||||
|
PythonMktime = "Tupel in Zeit umwandeln"
|
||||||
|
PythonTime = "Abrufen des aktuellen Zeitstempels"
|
||||||
|
PythonSetLocaltime = "Zeit aus einem Tupel einstellen"
|
||||||
|
PythonRTCmode = "Aktuellen RTC-Modus abrufen"
|
||||||
|
PythonSetRTCmode = "RTC-Modus festlegen"
|
||||||
|
PythonSort = "Die Liste sortieren"
|
||||||
|
PythonSqrt = "Quadratwurzel"
|
||||||
|
PythonSum = "Summe der Elemente einer Liste"
|
||||||
PythonTan = "Tangens"
|
PythonTan = "Tangens"
|
||||||
PythonTanh = "Hyperbolic tangent"
|
PythonTanh = "Hyperbolischer Tangens"
|
||||||
PythonText = "Display a text at (x,y) coordinates"
|
PythonText = "Text an (x,y) Koordinaten anzeigen"
|
||||||
PythonTimeFunction = "time module function prefix"
|
PythonTimeFunction = "Time-Modul-Funktionspräfix"
|
||||||
PythonTrunc = "x truncated to an integer"
|
PythonTrunc = "x abgeschnitten auf eine ganze Zahl"
|
||||||
PythonTurtleBackward = "Move backward by x pixels"
|
PythonTurtleBackward = "Um x Pixel rückwärts bewegen"
|
||||||
PythonTurtleCircle = "Circle of radius r pixels"
|
PythonTurtleCircle = "Kreis mit Radius r Pixel"
|
||||||
PythonTurtleColor = "Stiftfarbe setzen"
|
PythonTurtleColor = "Setzt die Stiftfarbe"
|
||||||
PythonTurtleColorMode = "Set the color mode to 1.0 or 255"
|
PythonTurtleColorMode = "Setzt Farbmodus auf 1.0 oder 255"
|
||||||
PythonTurtleForward = "Move forward by x pixels"
|
PythonTurtleForward = "Um x Pixel vorwärts bewegen"
|
||||||
PythonTurtleFunction = "turtle module function prefix"
|
PythonTurtleFunction = "Turtle-Modul-Funktionspräfix"
|
||||||
PythonTurtleGoto = "Move to (x,y) coordinates"
|
PythonTurtleGoto = "Bewegen zu (x,y) Koordinaten"
|
||||||
PythonTurtleHeading = "Return the current heading"
|
PythonTurtleHeading = "Liefert den aktuellen Kurs"
|
||||||
PythonTurtleHideturtle = "Hide the turtle"
|
PythonTurtleHideturtle = "Versteckt den Igel"
|
||||||
PythonTurtleIsdown = "Return True if the pen is down"
|
PythonTurtleIsdown = "Wahr, wenn der Stift unten ist"
|
||||||
PythonTurtleLeft = "Turn left by a degrees"
|
PythonTurtleLeft = "Nach links um ein Grad drehen"
|
||||||
PythonTurtlePendown = "Pull the pen down"
|
PythonTurtlePendown = "Den Stift nach unten ziehen"
|
||||||
PythonTurtlePensize = "Set the line thickness to x pixels"
|
PythonTurtlePensize = "Linienstärke auf x Pixel setzen"
|
||||||
PythonTurtlePenup = "Pull the pen up"
|
PythonTurtlePenup = "Den Stift nach oben ziehen"
|
||||||
PythonTurtlePosition = "Return the current (x,y) location"
|
PythonTurtlePosition = "Aktuelle (x,y) Position zurückgeben"
|
||||||
PythonTurtleReset = "Reset the drawing"
|
PythonTurtleReset = "Die Zeichnung zurücksetzen"
|
||||||
PythonTurtleRight = "Turn right by a degrees"
|
PythonTurtleRight = "Um ein Grad nach rechts drehen"
|
||||||
PythonTurtleSetheading = "Set the orientation to a degrees"
|
PythonTurtleSetheading = "Ausrichtung auf einen Grad setzen"
|
||||||
PythonTurtleSetposition = "Positionne la tortue"
|
PythonTurtleShowturtle = "Den Igel anzeigen"
|
||||||
PythonTurtleShowturtle = "Show the turtle"
|
PythonTurtleSpeed = "Zeichengeschwindigkeit von 0 bis 10"
|
||||||
PythonTurtleSpeed = "Drawing speed between 0 and 10"
|
PythonTurtleWrite = "Einen Text anzeigen"
|
||||||
PythonTurtleWrite = "Display a text"
|
PythonUniform = "Fließkommazahl in [a,b]"
|
||||||
PythonUniform = "Floating point number in [a,b]"
|
PythonImportTime = "Time-Modul importieren"
|
||||||
PythonImportTime = "Import time module"
|
PythonMonotonic = "Monotone Zeit zurückgeben"
|
||||||
PythonTimePrefix = "time module function prefix"
|
|
||||||
PythonTimeSleep = "Wait for n second"
|
|
||||||
PythonMonotonic = "Return monotonic time"
|
|
||||||
PythonFileOpen = "Öffnet eine Datei"
|
PythonFileOpen = "Öffnet eine Datei"
|
||||||
PythonFileSeekable = "Ist eine Datei durchsuchbar?"
|
PythonFileSeekable = "Kann Datei durchsucht werden?"
|
||||||
PythonFileSeek = "Dateicursor verschieben"
|
PythonFileSeek = "Bewegt den Cursor einer Datei"
|
||||||
PythonFileTell = "Cursorposition der Datei abrufen"
|
PythonFileTell = "Position des Cursors ermitteln"
|
||||||
PythonFileClose = "Schließt eine Datei"
|
PythonFileClose = "Schließt eine Datei"
|
||||||
PythonFileClosed = "Wenn Datei geschlossen wurde"
|
PythonFileClosed = "Wahr, wenn Datei geschlossen wurde"
|
||||||
PythonFileRead = "Bis zu size Bytes lesen"
|
PythonFileRead = "Lesen bis zu einer Größe von Bytes"
|
||||||
PythonFileWrite = "Schreibe b in die Datei"
|
PythonFileWrite = "Schreibe b in Datei"
|
||||||
PythonFileReadline = "Lies eine Zeile"
|
PythonFileReadline = "Liest Zeile oder Anzahl Bytes"
|
||||||
PythonFileReadlines = "Liest eine Liste von Zeilen"
|
PythonFileReadlines = "Liest eine Liste von Zeilen"
|
||||||
PythonFileTruncate = "Größe der Datei ändern"
|
PythonFileTruncate = "Verkleinert die Datei auf Größe"
|
||||||
PythonFileWritelines = "Schreibt eine Liste von Zeilen"
|
PythonFileWritelines = "Schreibt eine Liste von Zeilen"
|
||||||
PythonFileName = "Dateiname"
|
PythonFileName = "Enthält den Namen der Datei"
|
||||||
PythonFileMode = "Dateiöffnungsmodus"
|
PythonFileMode = "Enthält den Öffnungsmodus der Datei"
|
||||||
PythonFileReadable = "Ist die Datei lesbar?"
|
PythonFileReadable = "Kann Datei gelesen werden?"
|
||||||
PythonFileWritable = "Ist die Datei beschreibbar?"
|
PythonFileWritable = "Kann Datei geschrieben werden?"
|
||||||
|
PythonImportUtils = "Importieren von ulab.utils"
|
||||||
|
PythonUtilsFunction = "Funktionspräfix des utils-Moduls"
|
||||||
|
PythonTurtleBgcolor = "Ändern Sie die Hintergrundfarbe"
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
PythonPound = "Comment"
|
PythonPound = "Comment"
|
||||||
PythonPercent = "Modulo"
|
PythonPercent = "Modulo"
|
||||||
|
PythonColon = "Colon"
|
||||||
|
PythonSemicon = "Semicolon"
|
||||||
|
PythonExclamationMark = "Exclamation mark"
|
||||||
|
PythonLessThan = "Less than"
|
||||||
|
PythonGreaterThan = "Greater than"
|
||||||
|
PythonQuestionMark = "Question mark"
|
||||||
Python1J = "Imaginary i"
|
Python1J = "Imaginary i"
|
||||||
PythonLF = "Line feed"
|
PythonLF = "Line feed"
|
||||||
PythonTab = "Tabulation"
|
PythonTab = "Tabulation"
|
||||||
@@ -45,6 +51,7 @@ PythonCosh = "Hyperbolic cosine"
|
|||||||
PythonCount = "Count the occurrences of x"
|
PythonCount = "Count the occurrences of x"
|
||||||
PythonDegrees = "Convert x from radians to degrees"
|
PythonDegrees = "Convert x from radians to degrees"
|
||||||
PythonDivMod = "Quotient and remainder"
|
PythonDivMod = "Quotient and remainder"
|
||||||
|
PythonDrawCircle = "Draw a circle"
|
||||||
PythonDrawLine = "Draw a line"
|
PythonDrawLine = "Draw a line"
|
||||||
PythonDrawString = "Display a text from pixel (x,y)"
|
PythonDrawString = "Display a text from pixel (x,y)"
|
||||||
PythonErf = "Error function"
|
PythonErf = "Error function"
|
||||||
@@ -52,13 +59,18 @@ PythonErfc = "Complementary error function"
|
|||||||
PythonEval = "Return the evaluated expression"
|
PythonEval = "Return the evaluated expression"
|
||||||
PythonExp = "Exponential function"
|
PythonExp = "Exponential function"
|
||||||
PythonExpm1 = "Compute exp(x)-1"
|
PythonExpm1 = "Compute exp(x)-1"
|
||||||
|
PythonFactorial = "Factorial of x"
|
||||||
PythonFabs = "Absolute value"
|
PythonFabs = "Absolute value"
|
||||||
|
PythonFillCircle = "Fill a circle"
|
||||||
|
PythonFillPolygon = "Fill a polygon"
|
||||||
PythonFillRect = "Fill a rectangle at pixel (x,y)"
|
PythonFillRect = "Fill a rectangle at pixel (x,y)"
|
||||||
PythonFloat = "Convert x to a float"
|
PythonFloat = "Convert x to a float"
|
||||||
PythonFloor = "Floor"
|
PythonFloor = "Floor"
|
||||||
PythonFmod = "a modulo b"
|
PythonFmod = "a modulo b"
|
||||||
PythonFrExp = "Mantissa and exponent of x: (m,e)"
|
PythonFrExp = "Mantissa and exponent of x: (m,e)"
|
||||||
PythonGamma = "Gamma function"
|
PythonGamma = "Gamma function"
|
||||||
|
PythonGetKeys = "Get keys pressed"
|
||||||
|
PythonGetPalette = "Get theme palette"
|
||||||
PythonGetPixel = "Return pixel (x,y) color"
|
PythonGetPixel = "Return pixel (x,y) color"
|
||||||
PythonGetrandbits = "Integer with k random bits"
|
PythonGetrandbits = "Integer with k random bits"
|
||||||
PythonGrid = "Toggle the visibility of the grid"
|
PythonGrid = "Toggle the visibility of the grid"
|
||||||
@@ -70,6 +82,8 @@ PythonImportKandinsky = "Import kandinsky module"
|
|||||||
PythonImportRandom = "Import random module"
|
PythonImportRandom = "Import random module"
|
||||||
PythonImportMath = "Import math module"
|
PythonImportMath = "Import math module"
|
||||||
PythonImportMatplotlibPyplot = "Import matplotlib.pyplot module"
|
PythonImportMatplotlibPyplot = "Import matplotlib.pyplot module"
|
||||||
|
PythonImportNumpy = "Import ulab.numpy module"
|
||||||
|
PythonImportScipy = "Import ulab.scipy module"
|
||||||
PythonImportTime = "Import time module"
|
PythonImportTime = "Import time module"
|
||||||
PythonImportTurtle = "Import turtle module"
|
PythonImportTurtle = "Import turtle module"
|
||||||
PythonIndex = "Index of the first x occurrence"
|
PythonIndex = "Index of the first x occurrence"
|
||||||
@@ -80,8 +94,59 @@ PythonIonFunction = "ion module function prefix"
|
|||||||
PythonIsFinite = "Check if x is finite"
|
PythonIsFinite = "Check if x is finite"
|
||||||
PythonIsInfinite = "Check if x is infinity"
|
PythonIsInfinite = "Check if x is infinity"
|
||||||
PythonIsKeyDown = "Return True if the k key is down"
|
PythonIsKeyDown = "Return True if the k key is down"
|
||||||
|
PythonBattery = "Return battery voltage"
|
||||||
|
PythonBatteryLevel = "Return battery level"
|
||||||
|
PythonBatteryIscharging = "Return if battery is charging"
|
||||||
|
PythonSetBrightness = "Set brightness level"
|
||||||
|
PythonGetBrightness = "Get brightness level"
|
||||||
PythonIsNaN = "Check if x is a NaN"
|
PythonIsNaN = "Check if x is a NaN"
|
||||||
PythonKandinskyFunction = "kandinsky module function prefix"
|
PythonKandinskyFunction = "kandinsky module function prefix"
|
||||||
|
PythonKeyLeft = "LEFT ARROW key"
|
||||||
|
PythonKeyUp = "UP ARROW key"
|
||||||
|
PythonKeyDown = "DOWN ARROW key"
|
||||||
|
PythonKeyRight = "RIGHT ARROW key"
|
||||||
|
PythonKeyOk = "OK key"
|
||||||
|
PythonKeyBack = "BACK key"
|
||||||
|
PythonKeyHome = "HOME key"
|
||||||
|
PythonKeyOnOff = "ON/OFF key"
|
||||||
|
PythonKeyShift = "SHIFT key"
|
||||||
|
PythonKeyAlpha = "ALPHA key"
|
||||||
|
PythonKeyXnt = "X,N,T key"
|
||||||
|
PythonKeyVar = "VAR key"
|
||||||
|
PythonKeyToolbox = "TOOLBOX key"
|
||||||
|
PythonKeyBackspace = "BACKSPACE key"
|
||||||
|
PythonKeyExp = "EXPONENTIAL key"
|
||||||
|
PythonKeyLn = "NATURAL LOGARITHM key"
|
||||||
|
PythonKeyLog = "DECIMAL LOGARITHM key"
|
||||||
|
PythonKeyImaginary = "IMAGINARY I key"
|
||||||
|
PythonKeyComma = "COMMA key"
|
||||||
|
PythonKeyPower = "POWER key"
|
||||||
|
PythonKeySine = "SINE key"
|
||||||
|
PythonKeyCosine = "COSINE key"
|
||||||
|
PythonKeyTangent = "TANGENT key"
|
||||||
|
PythonKeyPi = "PI key"
|
||||||
|
PythonKeySqrt = "SQUARE ROOT key"
|
||||||
|
PythonKeySquare = "SQUARE key"
|
||||||
|
PythonKeySeven = "7 key"
|
||||||
|
PythonKeyEight = "8 key"
|
||||||
|
PythonKeyNine = "9 key"
|
||||||
|
PythonKeyLeftParenthesis = "LEFT PARENTHESIS key"
|
||||||
|
PythonKeyRightParenthesis = "RIGHT PARENTHESIS key"
|
||||||
|
PythonKeyFour = "4 key"
|
||||||
|
PythonKeyFive = "5 key"
|
||||||
|
PythonKeySix = "6 key"
|
||||||
|
PythonKeyMultiplication = "MULTIPLICATION key"
|
||||||
|
PythonKeyDivision = "DIVISION key"
|
||||||
|
PythonKeyOne = "1 key"
|
||||||
|
PythonKeyTwo = "2 key"
|
||||||
|
PythonKeyThree = "3 key"
|
||||||
|
PythonKeyPlus = "PLUS key"
|
||||||
|
PythonKeyMinus = "MINUS key"
|
||||||
|
PythonKeyZero = "0 key"
|
||||||
|
PythonKeyDot = "DOT key"
|
||||||
|
PythonKeyEe = "10 POWER X key"
|
||||||
|
PythonKeyAns = "ANS key"
|
||||||
|
PythonKeyExe = "EXE key"
|
||||||
PythonLdexp = "Return x*(2**i), inverse of frexp"
|
PythonLdexp = "Return x*(2**i), inverse of frexp"
|
||||||
PythonLength = "Length of an object"
|
PythonLength = "Length of an object"
|
||||||
PythonLgamma = "Log-gamma function"
|
PythonLgamma = "Log-gamma function"
|
||||||
@@ -94,6 +159,14 @@ PythonMax = "Maximum"
|
|||||||
PythonMin = "Minimum"
|
PythonMin = "Minimum"
|
||||||
PythonModf = "Fractional and integer parts of x"
|
PythonModf = "Fractional and integer parts of x"
|
||||||
PythonMonotonic = "Value of a monotonic clock"
|
PythonMonotonic = "Value of a monotonic clock"
|
||||||
|
PythonNumpyFunction = "numpy module prefix"
|
||||||
|
PythonNumpyFftFunction = "numpy.fft module prefix"
|
||||||
|
PythonNumpyLinalgFunction = "numpy.linalg module prefix"
|
||||||
|
PythonScipyFunction = "scipy module prefix"
|
||||||
|
PythonScipyLinalgFunction = "scipy.linalg module prefix"
|
||||||
|
PythonScipyOptimizeFunction = "scipy.optimize module prefix"
|
||||||
|
PythonScipySignalFunction = "scipy.signal module prefix"
|
||||||
|
PythonScipySpecialFunction = "scipy.special module prefix"
|
||||||
PythonOct = "Convert integer to octal"
|
PythonOct = "Convert integer to octal"
|
||||||
PythonPhase = "Phase of z"
|
PythonPhase = "Phase of z"
|
||||||
PythonPlot = "Plot y versus x as lines"
|
PythonPlot = "Plot y versus x as lines"
|
||||||
@@ -103,7 +176,7 @@ PythonPower = "x raised to the power y"
|
|||||||
PythonPrint = "Print object"
|
PythonPrint = "Print object"
|
||||||
PythonRadians = "Convert x from degrees to radians"
|
PythonRadians = "Convert x from degrees to radians"
|
||||||
PythonRandint = "Random integer in [a,b]"
|
PythonRandint = "Random integer in [a,b]"
|
||||||
PythonRandom = "Floating point number in [0,1["
|
PythonRandom = "Floating point number in [0,1]"
|
||||||
PythonRandomFunction = "random module function prefix"
|
PythonRandomFunction = "random module function prefix"
|
||||||
PythonRandrange = "Random number in range(start,stop)"
|
PythonRandrange = "Random number in range(start,stop)"
|
||||||
PythonRangeStartStop = "List from start to stop-1"
|
PythonRangeStartStop = "List from start to stop-1"
|
||||||
@@ -119,6 +192,12 @@ PythonShow = "Display the figure"
|
|||||||
PythonSin = "Sine"
|
PythonSin = "Sine"
|
||||||
PythonSinh = "Hyperbolic sine"
|
PythonSinh = "Hyperbolic sine"
|
||||||
PythonSleep = "Suspend the execution for t seconds"
|
PythonSleep = "Suspend the execution for t seconds"
|
||||||
|
PythonLocalTime = "Convert time into tuple"
|
||||||
|
PythonMktime = "Convert tuple into time"
|
||||||
|
PythonTime = "Get the current timestamp"
|
||||||
|
PythonSetLocaltime = "Set time from a tuple"
|
||||||
|
PythonRTCmode = "Get current RTC mode"
|
||||||
|
PythonSetRTCmode = "Set RTC mode"
|
||||||
PythonSort = "Sort the list"
|
PythonSort = "Sort the list"
|
||||||
PythonSqrt = "Square root"
|
PythonSqrt = "Square root"
|
||||||
PythonSum = "Sum the items of a list"
|
PythonSum = "Sum the items of a list"
|
||||||
@@ -145,19 +224,25 @@ PythonTurtlePosition = "Return the current (x,y) location"
|
|||||||
PythonTurtleReset = "Reset the drawing"
|
PythonTurtleReset = "Reset the drawing"
|
||||||
PythonTurtleRight = "Turn right by a degrees"
|
PythonTurtleRight = "Turn right by a degrees"
|
||||||
PythonTurtleSetheading = "Set the orientation to a degrees"
|
PythonTurtleSetheading = "Set the orientation to a degrees"
|
||||||
PythonTurtleSetposition = "Positionne la tortue"
|
|
||||||
PythonTurtleShowturtle = "Show the turtle"
|
PythonTurtleShowturtle = "Show the turtle"
|
||||||
PythonTurtleSpeed = "Drawing speed between 0 and 10"
|
PythonTurtleSpeed = "Drawing speed between 0 and 10"
|
||||||
PythonTurtleWrite = "Display a text"
|
PythonTurtleWrite = "Display a text"
|
||||||
PythonUniform = "Floating point number in [a,b]"
|
PythonUniform = "Floating point number in [a,b]"
|
||||||
PythonImportTime = "Import time module"
|
PythonImportTime = "Import time module"
|
||||||
PythonImportOs = "Import os module"
|
PythonImportOs = "Import os module"
|
||||||
|
PythonImportSys = "Import sys module"
|
||||||
PythonOsUname = "Get infos about the system"
|
PythonOsUname = "Get infos about the system"
|
||||||
|
PythonOsGetlogin = "Get username"
|
||||||
PythonOsRemove = "Remove file named filename"
|
PythonOsRemove = "Remove file named filename"
|
||||||
PythonOsRename = "Rename file oldname to newname"
|
PythonOsRename = "Rename file oldname to newname"
|
||||||
PythonOsListdir = "List files in memory"
|
PythonOsListdir = "List files in memory"
|
||||||
PythonTimePrefix = "time module function prefix"
|
PythonSysExit = "Terminate current program"
|
||||||
PythonTimeSleep = "Wait for n second"
|
PythonSysPrintexception = "Print exception"
|
||||||
|
PythonSysByteorder = "The byte order of the system"
|
||||||
|
PythonSysImplementation = "Information about Python"
|
||||||
|
PythonSysModules = "Dictionary of loaded modules"
|
||||||
|
PythonSysVersion = "Python language version (string)"
|
||||||
|
PythonSysVersioninfo = "Python language version (tuple)"
|
||||||
PythonMonotonic = "Return monotonic time"
|
PythonMonotonic = "Return monotonic time"
|
||||||
PythonFileOpen = "Opens a file"
|
PythonFileOpen = "Opens a file"
|
||||||
PythonFileSeekable = "Tells if seek can be used on a file"
|
PythonFileSeekable = "Tells if seek can be used on a file"
|
||||||
@@ -175,3 +260,6 @@ PythonFileName = "Contains file's name"
|
|||||||
PythonFileMode = "Contains file's open mode"
|
PythonFileMode = "Contains file's open mode"
|
||||||
PythonFileReadable = "Tells if read can be used on a file"
|
PythonFileReadable = "Tells if read can be used on a file"
|
||||||
PythonFileWritable = "Tells if write can be used on a file"
|
PythonFileWritable = "Tells if write can be used on a file"
|
||||||
|
PythonImportUtils = "Importing ulab.utils"
|
||||||
|
PythonUtilsFunction = "utils module function prefix"
|
||||||
|
PythonTurtleBgcolor = "Change the background color"
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
PythonPound = "Comment"
|
PythonPound = "Comment"
|
||||||
PythonPercent = "Modulo"
|
PythonPercent = "Modulo"
|
||||||
|
PythonColon = "Colon"
|
||||||
|
PythonSemicon = "Semicolon"
|
||||||
|
PythonExclamationMark = "Exclamation mark"
|
||||||
|
PythonLessThan = "Less than"
|
||||||
|
PythonGreaterThan = "Greater than"
|
||||||
|
PythonQuestionMark = "Question mark"
|
||||||
Python1J = "Imaginary i"
|
Python1J = "Imaginary i"
|
||||||
PythonLF = "Line feed"
|
PythonLF = "Line feed"
|
||||||
PythonTab = "Tabulation"
|
PythonTab = "Tabulation"
|
||||||
@@ -45,6 +51,7 @@ PythonCosh = "Hyperbolic cosine"
|
|||||||
PythonCount = "Count the occurrences of x"
|
PythonCount = "Count the occurrences of x"
|
||||||
PythonDegrees = "Convert x from radians to degrees"
|
PythonDegrees = "Convert x from radians to degrees"
|
||||||
PythonDivMod = "Quotient and remainder"
|
PythonDivMod = "Quotient and remainder"
|
||||||
|
PythonDrawCircle = "Draw a circle"
|
||||||
PythonDrawLine = "Draw a line"
|
PythonDrawLine = "Draw a line"
|
||||||
PythonDrawString = "Display a text from pixel (x,y)"
|
PythonDrawString = "Display a text from pixel (x,y)"
|
||||||
PythonErf = "Error function"
|
PythonErf = "Error function"
|
||||||
@@ -52,13 +59,18 @@ PythonErfc = "Complementary error function"
|
|||||||
PythonEval = "Return the evaluated expression"
|
PythonEval = "Return the evaluated expression"
|
||||||
PythonExp = "Exponential function"
|
PythonExp = "Exponential function"
|
||||||
PythonExpm1 = "Compute exp(x)-1"
|
PythonExpm1 = "Compute exp(x)-1"
|
||||||
|
PythonFactorial = "factorial de x"
|
||||||
PythonFabs = "Absolute value"
|
PythonFabs = "Absolute value"
|
||||||
|
PythonFillCircle = "Fill a circle"
|
||||||
|
PythonFillPolygon = "Fill a polygon"
|
||||||
PythonFillRect = "Fill a rectangle at pixel (x,y)"
|
PythonFillRect = "Fill a rectangle at pixel (x,y)"
|
||||||
PythonFloat = "Convert x to a float"
|
PythonFloat = "Convert x to a float"
|
||||||
PythonFloor = "Floor"
|
PythonFloor = "Floor"
|
||||||
PythonFmod = "a modulo b"
|
PythonFmod = "a modulo b"
|
||||||
PythonFrExp = "Mantissa and exponent of x: (m,e)"
|
PythonFrExp = "Mantissa and exponent of x: (m,e)"
|
||||||
PythonGamma = "Gamma function"
|
PythonGamma = "Gamma function"
|
||||||
|
PythonGetKeys = "Obtener teclas presionadas"
|
||||||
|
PythonGetPalette = "Get theme palette"
|
||||||
PythonGetPixel = "Return pixel (x,y) color"
|
PythonGetPixel = "Return pixel (x,y) color"
|
||||||
PythonGetrandbits = "Integer with k random bits"
|
PythonGetrandbits = "Integer with k random bits"
|
||||||
PythonGrid = "Toggle the visibility of the grid"
|
PythonGrid = "Toggle the visibility of the grid"
|
||||||
@@ -70,6 +82,8 @@ PythonImportKandinsky = "Import kandinsky module"
|
|||||||
PythonImportRandom = "Import random module"
|
PythonImportRandom = "Import random module"
|
||||||
PythonImportMath = "Import math module"
|
PythonImportMath = "Import math module"
|
||||||
PythonImportMatplotlibPyplot = "Import matplotlib.pyplot module"
|
PythonImportMatplotlibPyplot = "Import matplotlib.pyplot module"
|
||||||
|
PythonImportNumpy = "Import ulab.numpy module"
|
||||||
|
PythonImportScipy = "Import ulab.scipy module"
|
||||||
PythonImportTime = "Import time module"
|
PythonImportTime = "Import time module"
|
||||||
PythonImportTurtle = "Import turtle module"
|
PythonImportTurtle = "Import turtle module"
|
||||||
PythonIndex = "Index of the first x occurrence"
|
PythonIndex = "Index of the first x occurrence"
|
||||||
@@ -80,8 +94,59 @@ PythonIonFunction = "ion module function prefix"
|
|||||||
PythonIsFinite = "Check if x is finite"
|
PythonIsFinite = "Check if x is finite"
|
||||||
PythonIsInfinite = "Check if x is infinity"
|
PythonIsInfinite = "Check if x is infinity"
|
||||||
PythonIsKeyDown = "Return True if the k key is down"
|
PythonIsKeyDown = "Return True if the k key is down"
|
||||||
|
PythonBattery = "Rückgabe der Batteriespannung"
|
||||||
|
PythonBatteryLevel = "Gibt den Batteriestand zurück"
|
||||||
|
PythonBatteryIscharging = "Gibt zurück, ob die Batterie geladen wird"
|
||||||
|
PythonSetBrightness = "Establecer nivel de brillo"
|
||||||
|
PythonGetBrightness = "Obtener nivel de brillo"
|
||||||
PythonIsNaN = "Check if x is a NaN"
|
PythonIsNaN = "Check if x is a NaN"
|
||||||
PythonKandinskyFunction = "kandinsky module function prefix"
|
PythonKandinskyFunction = "kandinsky module function prefix"
|
||||||
|
PythonKeyLeft = "LEFT ARROW key"
|
||||||
|
PythonKeyUp = "UP ARROW key"
|
||||||
|
PythonKeyDown = "DOWN ARROW key"
|
||||||
|
PythonKeyRight = "RIGHT ARROW key"
|
||||||
|
PythonKeyOk = "OK key"
|
||||||
|
PythonKeyBack = "BACK key"
|
||||||
|
PythonKeyHome = "HOME key"
|
||||||
|
PythonKeyOnOff = "ON/OFF key"
|
||||||
|
PythonKeyShift = "SHIFT key"
|
||||||
|
PythonKeyAlpha = "ALPHA key"
|
||||||
|
PythonKeyXnt = "X,N,T key"
|
||||||
|
PythonKeyVar = "VAR key"
|
||||||
|
PythonKeyToolbox = "TOOLBOX key"
|
||||||
|
PythonKeyBackspace = "BACKSPACE key"
|
||||||
|
PythonKeyExp = "EXPONENTIAL key"
|
||||||
|
PythonKeyLn = "NATURAL LOGARITHM key"
|
||||||
|
PythonKeyLog = "DECIMAL LOGARITHM key"
|
||||||
|
PythonKeyImaginary = "IMAGINARY I key"
|
||||||
|
PythonKeyComma = "COMMA key"
|
||||||
|
PythonKeyPower = "POWER key"
|
||||||
|
PythonKeySine = "SINE key"
|
||||||
|
PythonKeyCosine = "COSINE key"
|
||||||
|
PythonKeyTangent = "TANGENT key"
|
||||||
|
PythonKeyPi = "PI key"
|
||||||
|
PythonKeySqrt = "SQUARE ROOT key"
|
||||||
|
PythonKeySquare = "SQUARE key"
|
||||||
|
PythonKeySeven = "7 key"
|
||||||
|
PythonKeyEight = "8 key"
|
||||||
|
PythonKeyNine = "9 key"
|
||||||
|
PythonKeyLeftParenthesis = "LEFT PARENTHESIS key"
|
||||||
|
PythonKeyRightParenthesis = "RIGHT PARENTHESIS key"
|
||||||
|
PythonKeyFour = "4 key"
|
||||||
|
PythonKeyFive = "5 key"
|
||||||
|
PythonKeySix = "6 key"
|
||||||
|
PythonKeyMultiplication = "MULTIPLICATION key"
|
||||||
|
PythonKeyDivision = "DIVISION key"
|
||||||
|
PythonKeyOne = "1 key"
|
||||||
|
PythonKeyTwo = "2 key"
|
||||||
|
PythonKeyThree = "3 key"
|
||||||
|
PythonKeyPlus = "PLUS key"
|
||||||
|
PythonKeyMinus = "MINUS key"
|
||||||
|
PythonKeyZero = "0 key"
|
||||||
|
PythonKeyDot = "DOT key"
|
||||||
|
PythonKeyEe = "10 POWER X key"
|
||||||
|
PythonKeyAns = "ANS key"
|
||||||
|
PythonKeyExe = "EXE key"
|
||||||
PythonLdexp = "Return x*(2**i), inverse of frexp"
|
PythonLdexp = "Return x*(2**i), inverse of frexp"
|
||||||
PythonLength = "Length of an object"
|
PythonLength = "Length of an object"
|
||||||
PythonLgamma = "Log-gamma function"
|
PythonLgamma = "Log-gamma function"
|
||||||
@@ -94,6 +159,14 @@ PythonMax = "Maximum"
|
|||||||
PythonMin = "Minimum"
|
PythonMin = "Minimum"
|
||||||
PythonModf = "Fractional and integer parts of x"
|
PythonModf = "Fractional and integer parts of x"
|
||||||
PythonMonotonic = "Value of a monotonic clock"
|
PythonMonotonic = "Value of a monotonic clock"
|
||||||
|
PythonNumpyFunction = "numpy module prefix"
|
||||||
|
PythonNumpyFftFunction = "numpy.fft module prefix"
|
||||||
|
PythonNumpyLinalgFunction = "numpy.linalg module prefix"
|
||||||
|
PythonScipyFunction = "scipy module prefix"
|
||||||
|
PythonScipyLinalgFunction = "scipy.linalg module prefix"
|
||||||
|
PythonScipyOptimizeFunction = "scipy.optimize module prefix"
|
||||||
|
PythonScipySignalFunction = "scipy.signal module prefix"
|
||||||
|
PythonScipySpecialFunction = "scipy.special module prefix"
|
||||||
PythonOct = "Convert integer to octal"
|
PythonOct = "Convert integer to octal"
|
||||||
PythonPhase = "Phase of z"
|
PythonPhase = "Phase of z"
|
||||||
PythonPlot = "Plot y versus x as lines"
|
PythonPlot = "Plot y versus x as lines"
|
||||||
@@ -119,6 +192,12 @@ PythonShow = "Display the figure"
|
|||||||
PythonSin = "Sine"
|
PythonSin = "Sine"
|
||||||
PythonSinh = "Hyperbolic sine"
|
PythonSinh = "Hyperbolic sine"
|
||||||
PythonSleep = "Suspend the execution for t seconds"
|
PythonSleep = "Suspend the execution for t seconds"
|
||||||
|
PythonLocalTime = "Convertir el tiempo en tupla"
|
||||||
|
PythonMktime = "Convertir tupla en tiempo"
|
||||||
|
PythonTime = "Obtener la marca de tiempo actual"
|
||||||
|
PythonSetLocaltime = "Establecer tiempo desde una tupla"
|
||||||
|
PythonRTCmode = "Obtener el modo RTC actual"
|
||||||
|
PythonSetRTCmode = "Establecer modo RTC"
|
||||||
PythonSort = "Sort the list"
|
PythonSort = "Sort the list"
|
||||||
PythonSqrt = "Square root"
|
PythonSqrt = "Square root"
|
||||||
PythonSum = "Sum the items of a list"
|
PythonSum = "Sum the items of a list"
|
||||||
@@ -145,19 +224,25 @@ PythonTurtlePosition = "Return the current (x,y) location"
|
|||||||
PythonTurtleReset = "Reset the drawing"
|
PythonTurtleReset = "Reset the drawing"
|
||||||
PythonTurtleRight = "Turn right by a degrees"
|
PythonTurtleRight = "Turn right by a degrees"
|
||||||
PythonTurtleSetheading = "Set the orientation to a degrees"
|
PythonTurtleSetheading = "Set the orientation to a degrees"
|
||||||
PythonTurtleSetposition = "Positionne la tortue"
|
|
||||||
PythonTurtleShowturtle = "Show the turtle"
|
PythonTurtleShowturtle = "Show the turtle"
|
||||||
PythonTurtleSpeed = "Drawing speed between 0 and 10"
|
PythonTurtleSpeed = "Drawing speed between 0 and 10"
|
||||||
PythonTurtleWrite = "Display a text"
|
PythonTurtleWrite = "Display a text"
|
||||||
PythonUniform = "Floating point number in [a,b]"
|
PythonUniform = "Floating point number in [a,b]"
|
||||||
PythonImportTime = "Import time module"
|
PythonImportTime = "Import time module"
|
||||||
PythonImportOs = "Import os module"
|
PythonImportOs = "Import os module"
|
||||||
|
PythonImportSys = "Import sys module"
|
||||||
PythonOsUname = " Información del sistema "
|
PythonOsUname = " Información del sistema "
|
||||||
|
PythonOsGetlogin = "Get username"
|
||||||
PythonOsRemove = "Eliminar un archivo"
|
PythonOsRemove = "Eliminar un archivo"
|
||||||
PythonOsRename = "Renombrar archivo"
|
PythonOsRename = "Renombrar archivo"
|
||||||
PythonOsListdir = "Archivos de la lista"
|
PythonOsListdir = "Archivos de la lista"
|
||||||
PythonTimePrefix = "time module function prefix"
|
PythonSysExit = "Terminate current program"
|
||||||
PythonTimeSleep = "Esperar n segundos"
|
PythonSysPrintexception = "Print exception"
|
||||||
|
PythonSysByteorder = "The byte order of the system"
|
||||||
|
PythonSysImplementation = "Information about Python"
|
||||||
|
PythonSysModules = "Dictionary of loaded modules"
|
||||||
|
PythonSysVersion = "Python language version (string)"
|
||||||
|
PythonSysVersioninfo = "Python language version (tuple)"
|
||||||
PythonMonotonic = "Tiempo monótono de retorno"
|
PythonMonotonic = "Tiempo monótono de retorno"
|
||||||
PythonFileOpen = "Opens a file"
|
PythonFileOpen = "Opens a file"
|
||||||
PythonFileSeekable = "Tells if seek can be used on a file"
|
PythonFileSeekable = "Tells if seek can be used on a file"
|
||||||
@@ -175,3 +260,6 @@ PythonFileName = "Contains file's name"
|
|||||||
PythonFileMode = "Contains file's open mode"
|
PythonFileMode = "Contains file's open mode"
|
||||||
PythonFileReadable = "Tells if read can be used on a file"
|
PythonFileReadable = "Tells if read can be used on a file"
|
||||||
PythonFileWritable = "Tells if write can be used on a file"
|
PythonFileWritable = "Tells if write can be used on a file"
|
||||||
|
PythonImportUtils = "Importando ulab.utils"
|
||||||
|
PythonUtilsFunction = "prefijo de función del módulo utils"
|
||||||
|
PythonTurtleBgcolor = "Cambiar el color de fondo"
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
PythonPound = "Commentaire"
|
PythonPound = "Commentaire"
|
||||||
PythonPercent = "Modulo"
|
PythonPercent = "Modulo"
|
||||||
|
PythonColon = "Deux-points"
|
||||||
|
PythonSemicon = "Point-virgule"
|
||||||
|
PythonExclamationMark = "Point d'exclamation"
|
||||||
|
PythonLessThan = "Inférieur à"
|
||||||
|
PythonGreaterThan = "Supérieur à"
|
||||||
|
PythonQuestionMark = "Point d'interrogation"
|
||||||
Python1J = "i complexe"
|
Python1J = "i complexe"
|
||||||
PythonLF = "Saut à la ligne"
|
PythonLF = "Saut à la ligne"
|
||||||
PythonTab = "Tabulation"
|
PythonTab = "Tabulation"
|
||||||
@@ -45,6 +51,7 @@ PythonCosh = "Cosinus hyperbolique"
|
|||||||
PythonCount = "Compte les occurrences de x"
|
PythonCount = "Compte les occurrences de x"
|
||||||
PythonDegrees = "Conversion de radians en degrés"
|
PythonDegrees = "Conversion de radians en degrés"
|
||||||
PythonDivMod = "Quotient et reste"
|
PythonDivMod = "Quotient et reste"
|
||||||
|
PythonDrawCircle = "Trace un cercle"
|
||||||
PythonDrawLine = "Trace une ligne"
|
PythonDrawLine = "Trace une ligne"
|
||||||
PythonDrawString = "Affiche un texte au pixel (x,y)"
|
PythonDrawString = "Affiche un texte au pixel (x,y)"
|
||||||
PythonErf = "Fonction d'erreur"
|
PythonErf = "Fonction d'erreur"
|
||||||
@@ -52,13 +59,18 @@ PythonErfc = "Fonction d'erreur complémentaire"
|
|||||||
PythonEval = "Evalue l'expression en argument "
|
PythonEval = "Evalue l'expression en argument "
|
||||||
PythonExp = "Fonction exponentielle"
|
PythonExp = "Fonction exponentielle"
|
||||||
PythonExpm1 = "Calcul de exp(x)-1"
|
PythonExpm1 = "Calcul de exp(x)-1"
|
||||||
|
PythonFactorial = "Factorielle de x"
|
||||||
PythonFabs = "Valeur absolue"
|
PythonFabs = "Valeur absolue"
|
||||||
|
PythonFillCircle = "Remplit un cercle"
|
||||||
|
PythonFillPolygon = "Remplit un polygone"
|
||||||
PythonFillRect = "Remplit un rectangle"
|
PythonFillRect = "Remplit un rectangle"
|
||||||
PythonFloat = "Conversion en flottant"
|
PythonFloat = "Conversion en flottant"
|
||||||
PythonFloor = "Partie entière"
|
PythonFloor = "Partie entière"
|
||||||
PythonFmod = "a modulo b"
|
PythonFmod = "a modulo b"
|
||||||
PythonFrExp = "Mantisse et exposant de x : (m,e)"
|
PythonFrExp = "Mantisse et exposant de x : (m,e)"
|
||||||
PythonGamma = "Fonction gamma"
|
PythonGamma = "Fonction gamma"
|
||||||
|
PythonGetKeys = "Obtenir les touches pressées"
|
||||||
|
PythonGetPalette = "Obtient la palette du thème"
|
||||||
PythonGetPixel = "Renvoie la couleur du pixel (x,y)"
|
PythonGetPixel = "Renvoie la couleur du pixel (x,y)"
|
||||||
PythonGetrandbits = "Nombre aléatoire sur k bits"
|
PythonGetrandbits = "Nombre aléatoire sur k bits"
|
||||||
PythonGrid = "Affiche ou masque la grille"
|
PythonGrid = "Affiche ou masque la grille"
|
||||||
@@ -70,6 +82,9 @@ PythonImportKandinsky = "Importation du module kandinsky"
|
|||||||
PythonImportRandom = "Importation du module random"
|
PythonImportRandom = "Importation du module random"
|
||||||
PythonImportMath = "Importation du module math"
|
PythonImportMath = "Importation du module math"
|
||||||
PythonImportMatplotlibPyplot = "Importation de matplotlib.pyplot"
|
PythonImportMatplotlibPyplot = "Importation de matplotlib.pyplot"
|
||||||
|
PythonImportNumpy = "Importation de ulab.numpy"
|
||||||
|
PythonImportScipy = "Importation de ulab.scipy"
|
||||||
|
PythonImportUtils = "Importation de ulab.utils"
|
||||||
PythonImportTurtle = "Importation du module turtle"
|
PythonImportTurtle = "Importation du module turtle"
|
||||||
PythonImportTime = "Importation du module time"
|
PythonImportTime = "Importation du module time"
|
||||||
PythonIndex = "Indice première occurrence de x"
|
PythonIndex = "Indice première occurrence de x"
|
||||||
@@ -80,8 +95,59 @@ PythonIonFunction = "Préfixe fonction module ion"
|
|||||||
PythonIsFinite = "Teste si x est fini"
|
PythonIsFinite = "Teste si x est fini"
|
||||||
PythonIsInfinite = "Teste si x est infini"
|
PythonIsInfinite = "Teste si x est infini"
|
||||||
PythonIsKeyDown = "Renvoie True si touche k enfoncée"
|
PythonIsKeyDown = "Renvoie True si touche k enfoncée"
|
||||||
|
PythonBattery = "Renvoie le voltage de la batterie"
|
||||||
|
PythonBatteryLevel = "Renvoie le niveau de la batterie"
|
||||||
|
PythonBatteryIscharging = "Chargement en cours"
|
||||||
|
PythonSetBrightness = "Définir le niveau de luminosité"
|
||||||
|
PythonGetBrightness = "Obtenir le niveau de luminosité"
|
||||||
PythonIsNaN = "Teste si x est NaN"
|
PythonIsNaN = "Teste si x est NaN"
|
||||||
PythonKandinskyFunction = "Préfixe fonction module kandinsky"
|
PythonKandinskyFunction = "Préfixe fonction module kandinsky"
|
||||||
|
PythonKeyLeft = "Touche FLECHE GAUCHE"
|
||||||
|
PythonKeyUp = "Touche FLECHE HAUT"
|
||||||
|
PythonKeyDown = "Touche FLECHE BAS"
|
||||||
|
PythonKeyRight = "Touche FLECHE DROITE"
|
||||||
|
PythonKeyOk = "Touche OK"
|
||||||
|
PythonKeyBack = "Touche RETOUR"
|
||||||
|
PythonKeyHome = "Touche HOME"
|
||||||
|
PythonKeyOnOff = "Touche ON/OFF"
|
||||||
|
PythonKeyShift = "Touche SHIFT"
|
||||||
|
PythonKeyAlpha = "Touche ALPHA"
|
||||||
|
PythonKeyXnt = "Touche X,N,T"
|
||||||
|
PythonKeyVar = "Touche VAR"
|
||||||
|
PythonKeyToolbox = "Touche BOITE A OUTILS"
|
||||||
|
PythonKeyBackspace = "Touche EFFACER"
|
||||||
|
PythonKeyExp = "Touche EXPONENTIELLE"
|
||||||
|
PythonKeyLn = "Touche LOGARITHME NEPERIEN"
|
||||||
|
PythonKeyLog = "Touche LOGARITHME DECIMAL"
|
||||||
|
PythonKeyImaginary = "Touche I IMAGINAIRE"
|
||||||
|
PythonKeyComma = "Touche VIRGULE"
|
||||||
|
PythonKeyPower = "Touche PUISSANCE"
|
||||||
|
PythonKeySine = "Touche SINUS"
|
||||||
|
PythonKeyCosine = "Touche COSINUS"
|
||||||
|
PythonKeyTangent = "Touche TANGENTE"
|
||||||
|
PythonKeyPi = "Touche PI"
|
||||||
|
PythonKeySqrt = "Touche RACINE CARREE"
|
||||||
|
PythonKeySquare = "Touche CARRE"
|
||||||
|
PythonKeySeven = "Touche 7"
|
||||||
|
PythonKeyEight = "Touche 8"
|
||||||
|
PythonKeyNine = "Touche 9"
|
||||||
|
PythonKeyLeftParenthesis = "Touche PARENTHESE GAUCHE"
|
||||||
|
PythonKeyRightParenthesis = "Touche PARENTHESE DROITE"
|
||||||
|
PythonKeyFour = "Touche 4"
|
||||||
|
PythonKeyFive = "Touche 5"
|
||||||
|
PythonKeySix = "Touche 6"
|
||||||
|
PythonKeyMultiplication = "Touche MULTIPLICATION"
|
||||||
|
PythonKeyDivision = "Touche DIVISION"
|
||||||
|
PythonKeyOne = "Touche 1"
|
||||||
|
PythonKeyTwo = "Touche 2"
|
||||||
|
PythonKeyThree = "Touche 3"
|
||||||
|
PythonKeyPlus = "Touche PLUS"
|
||||||
|
PythonKeyMinus = "Touche MOINS"
|
||||||
|
PythonKeyZero = "Touche 0"
|
||||||
|
PythonKeyDot = "Touche POINT"
|
||||||
|
PythonKeyEe = "Touche 10 PUISSANCE X"
|
||||||
|
PythonKeyAns = "Touche ANS"
|
||||||
|
PythonKeyExe = "Touche EXE"
|
||||||
PythonLdexp = "Inverse de frexp : x*(2**i)"
|
PythonLdexp = "Inverse de frexp : x*(2**i)"
|
||||||
PythonLength = "Longueur d'un objet"
|
PythonLength = "Longueur d'un objet"
|
||||||
PythonLgamma = "Logarithme de la fonction gamma"
|
PythonLgamma = "Logarithme de la fonction gamma"
|
||||||
@@ -94,6 +160,15 @@ PythonMax = "Maximum"
|
|||||||
PythonMin = "Minimum"
|
PythonMin = "Minimum"
|
||||||
PythonModf = "Parties fractionnaire et entière"
|
PythonModf = "Parties fractionnaire et entière"
|
||||||
PythonMonotonic = "Renvoie la valeur de l'horloge"
|
PythonMonotonic = "Renvoie la valeur de l'horloge"
|
||||||
|
PythonNumpyFunction = "Préfixe fonction du module numpy"
|
||||||
|
PythonNumpyFftFunction = "Préfixe fonction du module numpy.fft"
|
||||||
|
PythonNumpyLinalgFunction = "Préfixe fonction du module numpy.linalg"
|
||||||
|
PythonScipyFunction = "Préfixe fonction du module scipy"
|
||||||
|
PythonScipyLinalgFunction = "Préfixe fonction du module scipy.linalg"
|
||||||
|
PythonScipyOptimizeFunction = "Préfixe fonction du module scipy.optimize"
|
||||||
|
PythonScipySignalFunction = "Préfixe fonction du module scipy.signal"
|
||||||
|
PythonScipySpecialFunction = "Préfixe fonction du module scipy.special"
|
||||||
|
PythonUtilsFunction = "Préfixe fonction du module utils"
|
||||||
PythonOct = "Conversion en octal"
|
PythonOct = "Conversion en octal"
|
||||||
PythonPhase = "Argument de z"
|
PythonPhase = "Argument de z"
|
||||||
PythonPlot = "Trace y en fonction de x"
|
PythonPlot = "Trace y en fonction de x"
|
||||||
@@ -109,7 +184,7 @@ PythonRandrange = "Nombre dans range(start,stop)"
|
|||||||
PythonRangeStartStop = "Liste de start à stop-1"
|
PythonRangeStartStop = "Liste de start à stop-1"
|
||||||
PythonRangeStop = "Liste de 0 à stop-1"
|
PythonRangeStop = "Liste de 0 à stop-1"
|
||||||
PythonRect = "Conversion en algébrique"
|
PythonRect = "Conversion en algébrique"
|
||||||
PythonRemove = "Supprime le premier x de la liste"
|
PythonRemove = "Supprime le premier x de la liste"
|
||||||
PythonReverse = "Inverse les éléments de la liste"
|
PythonReverse = "Inverse les éléments de la liste"
|
||||||
PythonRound = "Arrondi à n décimales"
|
PythonRound = "Arrondi à n décimales"
|
||||||
PythonScatter = "Nuage des points (x,y)"
|
PythonScatter = "Nuage des points (x,y)"
|
||||||
@@ -119,6 +194,12 @@ PythonShow = "Affiche la figure"
|
|||||||
PythonSin = "Sinus"
|
PythonSin = "Sinus"
|
||||||
PythonSinh = "Sinus hyperbolique"
|
PythonSinh = "Sinus hyperbolique"
|
||||||
PythonSleep = "Suspend l'exécution t secondes"
|
PythonSleep = "Suspend l'exécution t secondes"
|
||||||
|
PythonLocalTime = "Convertir le temps en tuple"
|
||||||
|
PythonMktime = "Convertir le tuple en temps"
|
||||||
|
PythonTime = "Obtenir l'horodatage actuel"
|
||||||
|
PythonSetLocaltime = "Définir l'heure à partir d'un tuple"
|
||||||
|
PythonRTCmode = "Obtenir le mode RTC actuel"
|
||||||
|
PythonSetRTCmode = "Définir le mode RTC"
|
||||||
PythonSort = "Trie la liste"
|
PythonSort = "Trie la liste"
|
||||||
PythonSqrt = "Racine carrée"
|
PythonSqrt = "Racine carrée"
|
||||||
PythonSum = "Somme des éléments de la liste"
|
PythonSum = "Somme des éléments de la liste"
|
||||||
@@ -131,6 +212,7 @@ PythonTurtleBackward = "Recule de x pixels"
|
|||||||
PythonTurtleCircle = "Cercle de rayon r pixels"
|
PythonTurtleCircle = "Cercle de rayon r pixels"
|
||||||
PythonTurtleColor = "Modifie la couleur du tracé"
|
PythonTurtleColor = "Modifie la couleur du tracé"
|
||||||
PythonTurtleColorMode = "Met le mode de couleur à 1.0 ou 255"
|
PythonTurtleColorMode = "Met le mode de couleur à 1.0 ou 255"
|
||||||
|
PythonTurtleBgcolor = "Modifie la couleur du fond"
|
||||||
PythonTurtleForward = "Avance de x pixels"
|
PythonTurtleForward = "Avance de x pixels"
|
||||||
PythonTurtleFunction = "Préfixe fonction du module turtle"
|
PythonTurtleFunction = "Préfixe fonction du module turtle"
|
||||||
PythonTurtleGoto = "Va au point de coordonnées (x,y)"
|
PythonTurtleGoto = "Va au point de coordonnées (x,y)"
|
||||||
@@ -145,19 +227,25 @@ PythonTurtlePosition = "Renvoie la position (x,y)"
|
|||||||
PythonTurtleReset = "Réinitialise le dessin"
|
PythonTurtleReset = "Réinitialise le dessin"
|
||||||
PythonTurtleRight = "Pivote de a degrés vers la droite"
|
PythonTurtleRight = "Pivote de a degrés vers la droite"
|
||||||
PythonTurtleSetheading = "Met un cap de a degrés"
|
PythonTurtleSetheading = "Met un cap de a degrés"
|
||||||
PythonTurtleSetposition = "Positionne la tortue"
|
|
||||||
PythonTurtleShowturtle = "Affiche la tortue"
|
PythonTurtleShowturtle = "Affiche la tortue"
|
||||||
PythonTurtleSpeed = "Vitesse du tracé entre 0 et 10"
|
PythonTurtleSpeed = "Vitesse du tracé entre 0 et 10"
|
||||||
PythonTurtleWrite = "Affiche un texte"
|
PythonTurtleWrite = "Affiche un texte"
|
||||||
PythonUniform = "Nombre décimal dans [a,b]"
|
PythonUniform = "Nombre décimal dans [a,b]"
|
||||||
PythonImportTime = "Importation du module temps"
|
PythonImportTime = "Importation du module temps"
|
||||||
PythonImportOs = "Importation du module os"
|
PythonImportOs = "Importation du module os"
|
||||||
|
PythonImportSys = "Importation du module sys"
|
||||||
PythonOsUname = "Donne des infos sur le système"
|
PythonOsUname = "Donne des infos sur le système"
|
||||||
|
PythonOsGetlogin = "Donne le nom d'utilisateur"
|
||||||
PythonOsRemove = "Supprime le fichier nommé filename"
|
PythonOsRemove = "Supprime le fichier nommé filename"
|
||||||
PythonOsRename = "Renomme oldname en newname"
|
PythonOsRename = "Renomme oldname en newname"
|
||||||
PythonOsListdir = "Liste les fichiers"
|
PythonOsListdir = "Liste les fichiers"
|
||||||
PythonTimePrefix = "Préfixe fonction du module temps"
|
PythonSysExit = "Termine le programme"
|
||||||
PythonTimeSleep = "Attendre n secondes"
|
PythonSysPrintexception = "Imprime une exception"
|
||||||
|
PythonSysByteorder = "L'ordre des octets du système"
|
||||||
|
PythonSysImplementation = "Information sur Python"
|
||||||
|
PythonSysModules = "Dictionnaire des modules chargés"
|
||||||
|
PythonSysVersion = "Version du langage Python (string)"
|
||||||
|
PythonSysVersioninfo = "Version du langage Python (tuple)"
|
||||||
PythonMonotonic = "Retourne le temps monotone"
|
PythonMonotonic = "Retourne le temps monotone"
|
||||||
PythonFileOpen = "Ouvre un fichier"
|
PythonFileOpen = "Ouvre un fichier"
|
||||||
PythonFileSeekable = "Indique si seek peut être utilisé"
|
PythonFileSeekable = "Indique si seek peut être utilisé"
|
||||||
|
|||||||
@@ -1,177 +1,265 @@
|
|||||||
PythonPound = "Megjegyzés"
|
PythonPound = "Megjegyzés"
|
||||||
PythonPercent = "Modulo"
|
PythonPercent = "Modulo"
|
||||||
Python1J = "Képzeletbeli i"
|
PythonColon = "Kettőspont"
|
||||||
PythonLF = "Enter"
|
PythonSemicon = "Pontosvessző"
|
||||||
PythonTab = "Táblázat"
|
PythonExclamationMark = "Felkiáltójel"
|
||||||
PythonAmpersand = "Logikus és"
|
PythonLessThan = "Kisebb mint"
|
||||||
PythonSymbolExp = "logikus exkluzív vagy pedig"
|
PythonGreaterThan = "Nagyobb mint"
|
||||||
PythonVerticalBar = "logikus vagy pedig"
|
PythonQuestionMark = "Kérdőjel"
|
||||||
PythonImag = "z képzeletbeli része"
|
Python1J = "Képzeletbeli i"
|
||||||
PythonReal = "z valódi része"
|
PythonLF = "Enter"
|
||||||
PythonSingleQuote = "apostróf"
|
PythonTab = "Táblázat"
|
||||||
PythonAbs = "Abszolút érték/nagyság"
|
PythonAmpersand = "Logikus és"
|
||||||
PythonAcos = "Ív (arc) koszinusz"
|
PythonSymbolExp = "logikus exkluzív vagy pedig"
|
||||||
PythonAcosh = "Hiperbolikus arc koszinusz"
|
PythonVerticalBar = "logikus vagy pedig"
|
||||||
PythonAppend = "Lista végére hozzáadni x-et"
|
PythonImag = "z képzeletbeli része"
|
||||||
PythonArrow = "(x,y) nyíla (x+dx,y+dy) nyílához"
|
PythonReal = "z valódi része"
|
||||||
PythonAsin = "Ív (arc) szinusz"
|
PythonSingleQuote = "apostróf"
|
||||||
PythonAsinh = "Hiperbolikus ív (arc) szinusz"
|
PythonAbs = "Abszolút érték/nagyság"
|
||||||
PythonAtan = "Ív (arc) érintö (tan)"
|
PythonAcos = "Ív (arc) koszinusz"
|
||||||
PythonAtan2 = "atan(y/x) sámolása"
|
PythonAcosh = "Hiperbolikus arc koszinusz"
|
||||||
PythonAtanh = "Hiperbolikus ív (arc) érintö (atan)"
|
PythonAppend = "Lista végére hozzáadni x-et"
|
||||||
PythonAxis = "Tengelyeket (xmin,xmax,ymin,ymax)-ra állitani"
|
PythonArrow = "(x,y) nyíla (x+dx,y+dy) nyílához"
|
||||||
PythonBar = "Az x lista oszlopdiagramja"
|
PythonAsin = "Ív (arc) szinusz"
|
||||||
PythonBin = "Egész szám konvertálása binárisra"
|
PythonAsinh = "Hiperbolikus ív (arc) szinusz"
|
||||||
PythonCeil = "Mennyezet"
|
PythonAtan = "Ív (arc) érintö (tan)"
|
||||||
PythonChoice = "Véletlenszerü szám a listában"
|
PythonAtan2 = "atan(y/x) sámolása"
|
||||||
PythonClear = "A lista ürítése"
|
PythonAtanh = "Hiperbolikus ív (arc) érintö (atan)"
|
||||||
PythonCmathFunction = "cmath modul funkció elötag"
|
PythonAxis = "Tengelyeket (xmin,xmax,ymin,ymax)-ra állitani"
|
||||||
PythonColor = "Rgb (pzk) szín allítása"
|
PythonBar = "Az x lista oszlopdiagramja"
|
||||||
PythonColorBlack = "Fekete szín"
|
PythonBin = "Egész szám konvertálása binárisra"
|
||||||
PythonColorBlue = "Kék szín"
|
PythonCeil = "Mennyezet"
|
||||||
PythonColorBrown = "Barna szín"
|
PythonChoice = "Véletlenszerü szám a listában"
|
||||||
PythonColorGreen = "Zöld szín"
|
PythonClear = "A lista ürítése"
|
||||||
PythonColorGray = "Szürke szín"
|
PythonCmathFunction = "cmath modul funkció elötag"
|
||||||
PythonColorOrange = "Narancssárga szín"
|
PythonColor = "Rgb (pzk) szín allítása"
|
||||||
PythonColorPink = "Rózsaszín szín"
|
PythonColorBlack = "Fekete szín"
|
||||||
PythonColorPurple = "Lila szín"
|
PythonColorBlue = "Kék szín"
|
||||||
PythonColorRed = "Piros szín"
|
PythonColorBrown = "Barna szín"
|
||||||
PythonColorWhite = "Fehér szín"
|
PythonColorGreen = "Zöld szín"
|
||||||
PythonColorYellow = "Sárga szín"
|
PythonColorGray = "Szürke szín"
|
||||||
PythonComplex = "A + ib visszaadása"
|
PythonColorOrange = "Narancssárga szín"
|
||||||
PythonCopySign = "X visszaadása y jelével"
|
PythonColorPink = "Rózsaszín szín"
|
||||||
PythonCos = "Koszinusz"
|
PythonColorPurple = "Lila szín"
|
||||||
PythonCosh = "Hiperbolikus koszinusz"
|
PythonColorRed = "Piros szín"
|
||||||
PythonCount = "Számolja az x elöfordulását"
|
PythonColorWhite = "Fehér szín"
|
||||||
PythonDegrees = "x konvertálása radiánokrol fokokra"
|
PythonColorYellow = "Sárga szín"
|
||||||
PythonDivMod = "Hányados és maradék"
|
PythonComplex = "A + ib visszaadása"
|
||||||
PythonDrawLine = "Húzzon egy vonalat "
|
PythonCopySign = "X visszaadása y jelével"
|
||||||
PythonDrawString = "Szöveg megjelenítése (x, y)-en"
|
PythonCos = "Koszinusz"
|
||||||
PythonErf = "Hiba funkció"
|
PythonCosh = "Hiperbolikus koszinusz"
|
||||||
PythonErfc = "Kiegészítö hiba funkció"
|
PythonCount = "Számolja az x elöfordulását"
|
||||||
PythonEval = "Visszaadja az értékelt kifejezést"
|
PythonDegrees = "x konvertálása radiánokrol fokokra"
|
||||||
PythonExp = "Exponenciális függvény"
|
PythonDivMod = "Hányados és maradék"
|
||||||
PythonExpm1 = "exp(x)-1 sámitása"
|
PythonDrawCircle = "Rajzolj egy kört"
|
||||||
PythonFabs = "Abszolút érték"
|
PythonDrawLine = "Húzzon egy vonalat "
|
||||||
PythonFillRect = "Téglalap töltése"
|
PythonDrawString = "Szöveg megjelenítése (x, y)-en"
|
||||||
PythonFloat = "Konvertálása tizedes számra"
|
PythonErf = "Hiba funkció"
|
||||||
PythonFloor = "Egész része"
|
PythonErfc = "Kiegészítö hiba funkció"
|
||||||
PythonFmod = "a modulo b"
|
PythonEval = "Visszaadja az értékelt kifejezést"
|
||||||
PythonFrExp = "X mantissája és kiállítója"
|
PythonExp = "Exponenciális függvény"
|
||||||
PythonGamma = "Gamma funkció"
|
PythonExpm1 = "exp(x)-1 sámitása"
|
||||||
PythonGetPixel = "Visszatéríti (x,y) színét"
|
PythonFactorial = "x faktorál"
|
||||||
PythonGetrandbits = "Váletlenszám visszatérítése k biten"
|
PythonFabs = "Abszolút érték"
|
||||||
PythonGrid = "Rács megjelenítése/elrejtése"
|
PythonFillRect = "Téglalap töltése"
|
||||||
PythonHex = "Decimális szám konvertálása hexadecimális számra"
|
PythonFillCircle = "Kitölti a kört"
|
||||||
PythonHist = "x hisztográmiája"
|
PythonFillPolygon = "Kitölti a poligont"
|
||||||
PythonImportCmath = "cmath modul importálása"
|
PythonFloat = "Konvertálása tizedes számra"
|
||||||
PythonImportIon = "Ion modul importálása"
|
PythonFloor = "Egész része"
|
||||||
PythonImportKandinsky = "Kandinsky modul importálása"
|
PythonFmod = "a modulo b"
|
||||||
PythonImportRandom = "Véletlenszerü modul importálása"
|
PythonFrExp = "X mantissája és kiállítója"
|
||||||
PythonImportMath = "math modul importálása"
|
PythonGamma = "Gamma funkció"
|
||||||
PythonImportMatplotlibPyplot = "matplotlib.pyplot modul importálása"
|
PythonGetKeys = "Billentyűk lenyomva"
|
||||||
PythonImportTurtle = "turtle modul importálása"
|
PythonGetPalette = "Téma paletta beszerzése"
|
||||||
PythonImportTime = "time modul importálása"
|
PythonGetPixel = "Visszatéríti (x,y) színét"
|
||||||
PythonIndex = "Az elsö x esemény indexe"
|
PythonGetrandbits = "Váletlenszám visszatérítése k biten"
|
||||||
PythonInput = "Irjon egy értéket (számot)"
|
PythonGrid = "Rács megjelenítése/elrejtése"
|
||||||
PythonInsert = "x-et i. pozícióra helyezze a listában"
|
PythonHex = "Decimális szám konvertálása hexadecimális számra"
|
||||||
PythonInt = "egész számra konvertálás"
|
PythonHist = "x hisztográmiája"
|
||||||
PythonIonFunction = "ion modul funkció elötag"
|
PythonImportCmath = "cmath modul importálása"
|
||||||
PythonIsFinite = "x véges-e"
|
PythonImportIon = "Ion modul importálása"
|
||||||
PythonIsInfinite = "x végtelen-e"
|
PythonImportKandinsky = "Kandinsky modul importálása"
|
||||||
PythonIsKeyDown = "True-t válaszol ha a k gomb le van nyomva"
|
PythonImportRandom = "Véletlenszerü modul importálása"
|
||||||
PythonIsNaN = "Ellenörizze hogy x nem NaN"
|
PythonImportMath = "math modul importálása"
|
||||||
PythonKandinskyFunction = "kandinsky modul funkció elötag"
|
PythonImportMatplotlibPyplot = "matplotlib.pyplot modul importálása"
|
||||||
PythonLdexp = "frexp ellentéte : x*(2**i)"
|
PythonImportNumpy = "ulab.numpy modul importálása"
|
||||||
PythonLength = "Egy targy hossza"
|
PythonImportScipy = "ulab.scipy modul importálása"
|
||||||
PythonLgamma = "Gamma funkció logaritmusa"
|
PythonImportTurtle = "turtle modul importálása"
|
||||||
PythonLog = "a alapú logaritmus"
|
PythonImportTime = "time modul importálása"
|
||||||
PythonLog10 = "Decimális logaritmus"
|
PythonIndex = "Az elsö x esemény indexe"
|
||||||
PythonLog2 = "Bináris logaritmus"
|
PythonInput = "Irjon egy értéket (számot)"
|
||||||
PythonMathFunction = "math modul funkció elötag"
|
PythonInsert = "x-et i. pozícióra helyezze a listában"
|
||||||
PythonMatplotlibPyplotFunction = "matplotlib.pyplot elötag"
|
PythonInt = "egész számra konvertálás"
|
||||||
PythonMax = "Maximum"
|
PythonIonFunction = "ion modul funkció elötag"
|
||||||
PythonMin = "Minimum"
|
PythonIsFinite = "x véges-e"
|
||||||
PythonModf = "x-nek tört és egész részei"
|
PythonIsInfinite = "x végtelen-e"
|
||||||
PythonMonotonic = "Az óra értékét adja vissza"
|
PythonIsKeyDown = "True-t válaszol ha a k gomb le van nyomva"
|
||||||
PythonOct = "Decimális szám konvertálása octális számra"
|
PythonBattery = "Az akkumulátor feszültségének visszaadása"
|
||||||
PythonPhase = "z fázisa"
|
PythonBatteryLevel = "Az akkumulátor töltöttségi szintjének visszaadása"
|
||||||
PythonPlot = "y-t jelöli x függvényében"
|
PythonBatteryIscharging = "Visszaadja, ha az akkumulátor töltődik"
|
||||||
PythonPolar = "Verctorizálni"
|
PythonSetBrightness = "Fényerőszint beállítása"
|
||||||
PythonPop = "Az utolsó elemet el törölni"
|
PythonGetBrightness = "Get brightness level"
|
||||||
PythonPower = "x y. kitevö"
|
PythonIsNaN = "Ellenörizze hogy x nem NaN"
|
||||||
PythonPrint = "Ki irni a elemeket"
|
PythonKandinskyFunction = "kandinsky modul funkció elötag"
|
||||||
PythonRadians = "Fokról radiánra konvertálni"
|
PythonLdexp = "frexp ellentéte : x*(2**i)"
|
||||||
PythonRandint = "Véletlen egész szám [a;b] -ban"
|
PythonLength = "Egy targy hossza"
|
||||||
PythonRandom = "Decimális szám [0;1] -ban"
|
PythonLgamma = "Gamma funkció logaritmusa"
|
||||||
PythonRandomFunction = "random modul funkció elötag"
|
PythonLog = "a alapú logaritmus"
|
||||||
PythonRandrange = "Véletlen szám range(start,stop)-ban"
|
PythonLog10 = "Decimális logaritmus"
|
||||||
PythonRangeStartStop = "start-tol stop-ig listája"
|
PythonLog2 = "Bináris logaritmus"
|
||||||
PythonRangeStop = "0 tol stop-ig lista"
|
PythonMathFunction = "math modul funkció elötag"
|
||||||
PythonRect = "Algebrai számra konvertálni"
|
PythonMatplotlibPyplotFunction = "matplotlib.pyplot elötag"
|
||||||
PythonRemove = "Elsö x elöfordulását törolni"
|
PythonMax = "Maximum"
|
||||||
PythonReverse = "A lista elemeit megfordítani (másik irány)"
|
PythonMin = "Minimum"
|
||||||
PythonRound = "N számjegyre kerekítni"
|
PythonModf = "x-nek tört és egész részei"
|
||||||
PythonScatter = "(x,y) halmaza"
|
PythonMonotonic = "Az óra értékét adja vissza"
|
||||||
PythonSeed = "Inicializálni a véletlenszám-választót"
|
PythonNumpyFunction = "numpy elötag"
|
||||||
PythonSetPixel = "Az (x,y) pixel-t ki szinezni"
|
PythonNumpyFftFunction = "numpy.fft elötag"
|
||||||
PythonShow = "Mutassa az ábrát"
|
PythonNumpyLinalgFunction = "numpy.linalg elötag"
|
||||||
PythonSin = "Szinusz"
|
PythonScipyFunction = "scipy elötag"
|
||||||
PythonSinh = "Hiperbolikus szinusz"
|
PythonScipyLinalgFunction = "scipy.linalg elötag"
|
||||||
PythonSleep = "t másodpercre meg állitani a programmot"
|
PythonScipyOptimizeFunction = "scipy.optimize elötag"
|
||||||
PythonSort = "A listát rendezni"
|
PythonScipySignalFunction = "scipy.signal elötag"
|
||||||
PythonSqrt = "Négyzetgyök"
|
PythonScipySpecialFunction = "scipy.special elötag"
|
||||||
PythonSum = "Összeadni a lista elemeit"
|
PythonOct = "Decimális szám konvertálása octális számra"
|
||||||
PythonTan = "Érintö (tan)"
|
PythonPhase = "z fázisa"
|
||||||
PythonTanh = "Hiperbolikus érintö (tan)"
|
PythonPlot = "y-t jelöli x függvényében"
|
||||||
PythonText = "(x,y) nél egy szöveget irni"
|
PythonPolar = "Verctorizálni"
|
||||||
PythonTimeFunction = "time funkció elötag"
|
PythonPop = "Az utolsó elemet el törölni"
|
||||||
PythonTrunc = "Egész csonka (?)"
|
PythonPower = "x y. kitevö"
|
||||||
PythonTurtleBackward = "x pixelt hátra"
|
PythonPrint = "Ki irni a elemeket"
|
||||||
PythonTurtleCircle = "r pixel sugarú kört rajzolni"
|
PythonRadians = "Fokról radiánra konvertálni"
|
||||||
PythonTurtleColor = "Toll szinét beállitani"
|
PythonRandint = "Véletlen egész szám [a;b] -ban"
|
||||||
PythonTurtleColorMode = "Szin módot 1.0-ra vagy 255-ra állitani"
|
PythonRandom = "Decimális szám [0;1] -ban"
|
||||||
PythonTurtleForward = "x pixelt elölre"
|
PythonRandomFunction = "random modul funkció elötag"
|
||||||
PythonTurtleFunction = "turtle modul funkció elötag"
|
PythonRandrange = "Véletlen szám range(start,stop)-ban"
|
||||||
PythonTurtleGoto = "Menjen a (x,y) koordinátákra"
|
PythonRangeStartStop = "start-tol stop-ig listája"
|
||||||
PythonTurtleHeading = "Visszaadja az aktuális irányt"
|
PythonRangeStop = "0 tol stop-ig lista"
|
||||||
PythonTurtleHideturtle = "A teknös elrejtése"
|
PythonRect = "Algebrai számra konvertálni"
|
||||||
PythonTurtleIsdown = "True-t válaszol ha a toll irás pozícióban van"
|
PythonRemove = "Elsö x elöfordulását törolni"
|
||||||
PythonTurtleLeft = "a fokkot forduljon balra"
|
PythonReverse = "A lista elemeit megfordítani (másik irány)"
|
||||||
PythonTurtlePendown = "Húzza le a tollat"
|
PythonRound = "N számjegyre kerekítni"
|
||||||
PythonTurtlePensize = "Állítsa a vonalvastagságot x pixelre"
|
PythonScatter = "(x,y) halmaza"
|
||||||
PythonTurtlePenup = "Húzza fel a tollat"
|
PythonSeed = "Inicializálni a véletlenszám-választót"
|
||||||
PythonTurtlePosition = "Az aktuális (x,y) pozíciót visszaadása"
|
PythonSetPixel = "Az (x,y) pixel-t ki szinezni"
|
||||||
PythonTurtleReset = "Visszaállitani a rajzot (torléssel)"
|
PythonShow = "Mutassa az ábrát"
|
||||||
PythonTurtleRight = "a fokkot forduljon jobbra"
|
PythonSin = "Szinusz"
|
||||||
PythonTurtleSetheading = "a fokokra állítja be az irányt"
|
PythonSinh = "Hiperbolikus szinusz"
|
||||||
PythonTurtleSetposition = "A teknös pozicioját allitja"
|
PythonSleep = "t másodpercre meg állitani a programmot"
|
||||||
PythonTurtleShowturtle = "A teknöst meg mutatni"
|
PythonLocalTime = "Idő konvertálása csomóvá"
|
||||||
PythonTurtleSpeed = "Rajzolási sebesség 0 és 10 között"
|
PythonMktime = "A tuple konvertálása az időben"
|
||||||
PythonTurtleWrite = "Szöveg irás"
|
PythonTime = "Az aktuális időbélyeg letöltése"
|
||||||
PythonUniform = "Lebegöpontos szám [a,b] -ban"
|
PythonSetLocaltime = "Idő beállítása egy csomóból"
|
||||||
PythonImportTime = "time modul importálása"
|
PythonRTCmode = "Aktuális RTC mód"
|
||||||
PythonTimePrefix = "time funkció elötag"
|
PythonSetRTCmode = "RTC mód beállítása"
|
||||||
PythonTimeSleep = "n másodpercet várni"
|
PythonSort = "A listát rendezni"
|
||||||
PythonMonotonic = "Meg fordítani a monoton idö"
|
PythonSqrt = "Négyzetgyök"
|
||||||
PythonFileOpen = "Fájl megnyitása"
|
PythonSum = "Összeadni a lista elemeit"
|
||||||
PythonFileSeekable = "Seek-et lehete használni"
|
PythonTan = "Érintö (tan)"
|
||||||
PythonFileSeek = "A kurzort áthelyezni"
|
PythonTanh = "Hiperbolikus érintö (tan)"
|
||||||
PythonFileTell = "Visszaadja a kurzor helye"
|
PythonText = "(x,y) nél egy szöveget irni"
|
||||||
PythonFileClose = "Bezárni egy fájlt"
|
PythonTimeFunction = "time funkció elötag"
|
||||||
PythonFileClosed = "True ha a fájl bezárva"
|
PythonTrunc = "Egész csonka (?)"
|
||||||
PythonFileRead = "Olvas 16 bájtig"
|
PythonTurtleBackward = "x pixelt hátra"
|
||||||
PythonFileWrite = "b-t irjon a fájlba"
|
PythonTurtleCircle = "r pixel sugarú kört rajzolni"
|
||||||
PythonFileReadline = "Olvas egy sort vagy 16 bájtig"
|
PythonTurtleColor = "Toll szinét beállitani"
|
||||||
PythonFileReadlines = "Olvas több sort"
|
PythonTurtleColorMode = "Szin módot 1.0-ra vagy 255-ra állitani"
|
||||||
PythonFileTruncate = "A fájl átméretezése"
|
PythonTurtleForward = "x pixelt elölre"
|
||||||
PythonFileWritelines = "Irjon több sort"
|
PythonTurtleFunction = "turtle modul funkció elötag"
|
||||||
PythonFileName = "A fájl neve"
|
PythonTurtleGoto = "Menjen a (x,y) koordinátákra"
|
||||||
PythonFileMode = "A fájl nyitott módja"
|
PythonTurtleHeading = "Visszaadja az aktuális irányt"
|
||||||
PythonFileReadable = "read-et lehete használni"
|
PythonTurtleHideturtle = "A teknös elrejtése"
|
||||||
PythonFileWritable = "write-ot lehete használni"
|
PythonTurtleIsdown = "True-t válaszol ha a toll irás pozícióban van"
|
||||||
PythonImportOs = "os modul importálása"
|
PythonTurtleLeft = "a fokkot forduljon balra"
|
||||||
PythonOsUname = "Rendszer informaciók"
|
PythonTurtlePendown = "Húzza le a tollat"
|
||||||
PythonOsRemove = "Fájl törlése"
|
PythonTurtlePensize = "Állítsa a vonalvastagságot x pixelre"
|
||||||
PythonOsRename = "Fájl átnevezése"
|
PythonTurtlePenup = "Húzza fel a tollat"
|
||||||
PythonOsListdir = "Fájlok listája"
|
PythonTurtlePosition = "Az aktuális (x,y) pozíciót visszaadása"
|
||||||
|
PythonTurtleReset = "Visszaállitani a rajzot (torléssel)"
|
||||||
|
PythonTurtleRight = "a fokkot forduljon jobbra"
|
||||||
|
PythonTurtleSetheading = "a fokokra állítja be az irányt"
|
||||||
|
PythonTurtleShowturtle = "A teknöst meg mutatni"
|
||||||
|
PythonTurtleSpeed = "Rajzolási sebesség 0 és 10 között"
|
||||||
|
PythonTurtleWrite = "Szöveg irás"
|
||||||
|
PythonUniform = "Lebegöpontos szám [a,b] -ban"
|
||||||
|
PythonImportTime = "time modul importálása"
|
||||||
|
PythonMonotonic = "Meg fordítani a monoton idö"
|
||||||
|
PythonFileOpen = "Fájl megnyitása"
|
||||||
|
PythonFileSeekable = "Seek-et lehete használni"
|
||||||
|
PythonFileSeek = "A kurzort áthelyezni"
|
||||||
|
PythonFileTell = "Visszaadja a kurzor helye"
|
||||||
|
PythonFileClose = "Bezárni egy fájlt"
|
||||||
|
PythonFileClosed = "True ha a fájl bezárva"
|
||||||
|
PythonFileRead = "Olvas 16 bájtig"
|
||||||
|
PythonFileWrite = "b-t irjon a fájlba"
|
||||||
|
PythonFileReadline = "Olvas egy sort vagy 16 bájtig"
|
||||||
|
PythonFileReadlines = "Olvas több sort"
|
||||||
|
PythonFileTruncate = "A fájl átméretezése"
|
||||||
|
PythonFileWritelines = "Irjon több sort"
|
||||||
|
PythonFileName = "A fájl neve"
|
||||||
|
PythonFileMode = "A fájl nyitott módja"
|
||||||
|
PythonFileReadable = "read-et lehete használni"
|
||||||
|
PythonFileWritable = "write-ot lehete használni"
|
||||||
|
PythonImportOs = "os modul importálása"
|
||||||
|
PythonOsUname = "Rendszer informaciók"
|
||||||
|
PythonOsGetlogin = "Get username"
|
||||||
|
PythonOsRemove = "Fájl törlése"
|
||||||
|
PythonOsRename = "Fájl átnevezése"
|
||||||
|
PythonOsListdir = "Fájlok listája"
|
||||||
|
PythonImportSys = "sys modul importálása"
|
||||||
|
PythonSysExit = "Terminate current program"
|
||||||
|
PythonSysPrintexception = "Print exception"
|
||||||
|
PythonSysByteorder = "The byte order of the system"
|
||||||
|
PythonSysImplementation = "Information about Python"
|
||||||
|
PythonSysModules = "Dictionary of loaded modules"
|
||||||
|
PythonSysVersion = "Python language version (string)"
|
||||||
|
PythonSysVersioninfo = "Python language version (tuple)"
|
||||||
|
PythonKeyLeft = "BALRA NYÍL billentyű"
|
||||||
|
PythonKeyUp = "FEL NYÍL billentyű"
|
||||||
|
PythonKeyDown = "LE NYÍL billentyű"
|
||||||
|
PythonKeyRight = "JOBBRA NYÍL billentyű"
|
||||||
|
PythonKeyOk = "OK gomb"
|
||||||
|
PythonKeyBack = "VISSZA gomb"
|
||||||
|
PythonKeyHome = "Lakáskulcs"
|
||||||
|
PythonKeyOnOff = "BE/KI gomb"
|
||||||
|
PythonKeyShift = "SHIFT billentyű"
|
||||||
|
PythonKeyAlpha = "ALPHA kulcs"
|
||||||
|
PythonKeyXnt = "X,N,T gomb"
|
||||||
|
PythonKeyVar = "VAR gomb"
|
||||||
|
PythonKeyToolbox = "TOOLBOX gomb"
|
||||||
|
PythonKeyBackspace = "BACKSPACE billentyű"
|
||||||
|
PythonKeyExp = "EXPONENTIÁLIS kulcs"
|
||||||
|
PythonKeyLn = "TERMÉSZETES LOGARITMUS kulcs"
|
||||||
|
PythonKeyLog = "DECIMÁLIS LOGARITMUS billentyű"
|
||||||
|
PythonKeyImaginary = "KÉPZELETES I kulcs"
|
||||||
|
PythonKeyComma = "VESZSŰ gomb"
|
||||||
|
PythonKeyPower = "POWER gomb"
|
||||||
|
PythonKeySine = "SINE gomb"
|
||||||
|
PythonKeyCosine = "KOSINUS kulcs"
|
||||||
|
PythonKeyTangent = "ÉRINTŐ gomb"
|
||||||
|
PythonKeyPi = "PI kulcs"
|
||||||
|
PythonKeySqrt = "NÉGYGYÖK kulcs"
|
||||||
|
PythonKeySquare = "SZÖGZET billentyű"
|
||||||
|
PythonKeySeven = "7 kulcs"
|
||||||
|
PythonKeyEight = "8 kulcs"
|
||||||
|
PythonKeyNine = "9 kulcs"
|
||||||
|
PythonKeyLeftParenthesis = "BAL ZÁRÓZELŐ gomb"
|
||||||
|
PythonKeyRightParenthesis = "JOBB ZÁRÓZELŐ billentyű"
|
||||||
|
PythonKeyFour = "4 kulcs"
|
||||||
|
PythonKeyFive = "5 kulcs"
|
||||||
|
PythonKeySix = "6 kulcs"
|
||||||
|
PythonKeyMultiplication = "SZORZAT gomb"
|
||||||
|
PythonKeyDivision = "OSZTÁS kulcs"
|
||||||
|
PythonKeyOne = "1 kulcs"
|
||||||
|
PythonKeyTwo = "2 kulcs"
|
||||||
|
PythonKeyThree = "3 kulcs"
|
||||||
|
PythonKeyPlus = "PLUSZ kulcs"
|
||||||
|
PythonKeyMinus = "MÍNUS gomb"
|
||||||
|
PythonKeyZero = "0 kulcs"
|
||||||
|
PythonKeyDot = "DOT gomb"
|
||||||
|
PythonKeyEe = "10 POWER X gomb"
|
||||||
|
PythonKeyAns = "ANS kulcs"
|
||||||
|
PythonKeyExe = "EXE kulcs"
|
||||||
|
PythonImportUtils = "Az ulab.utils importálása"
|
||||||
|
PythonUtilsFunction = "utils modul függvény előtagja"
|
||||||
|
PythonTurtleBgcolor = "Módosítsa a háttérszínt"
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
PythonPound = "Commento"
|
PythonPound = "Commento"
|
||||||
PythonPercent = "Modulo"
|
PythonPercent = "Modulo"
|
||||||
|
PythonColon = "Due punti"
|
||||||
|
PythonSemicon = "Punto e virgola"
|
||||||
|
PythonExclamationMark = "Punto esclamativo"
|
||||||
|
PythonLessThan = "Minore di"
|
||||||
|
PythonGreaterThan = "Maggiore di"
|
||||||
|
PythonQuestionMark = "Punto interrogativo"
|
||||||
Python1J = "Unità immaginaria"
|
Python1J = "Unità immaginaria"
|
||||||
PythonLF = "Nuova riga"
|
PythonLF = "Nuova riga"
|
||||||
PythonTab = "Tabulazione"
|
PythonTab = "Tabulazione"
|
||||||
@@ -25,7 +31,7 @@ PythonBin = "Converte un intero in binario"
|
|||||||
PythonCeil = "Parte intera superiore"
|
PythonCeil = "Parte intera superiore"
|
||||||
PythonChoice = "Numero aleatorio nella lista"
|
PythonChoice = "Numero aleatorio nella lista"
|
||||||
PythonClear = "Svuota la lista"
|
PythonClear = "Svuota la lista"
|
||||||
PythonCmathFunction = "Funz. prefissata modulo cmath"
|
PythonCmathFunction = "Prefisso funzione del modulo cmath"
|
||||||
PythonColor = "Definisci un colore rvb"
|
PythonColor = "Definisci un colore rvb"
|
||||||
PythonColorBlack = "Colore nero"
|
PythonColorBlack = "Colore nero"
|
||||||
PythonColorBlue = "Colore blu"
|
PythonColorBlue = "Colore blu"
|
||||||
@@ -45,6 +51,7 @@ PythonCosh = "Coseno iperbolico"
|
|||||||
PythonCount = "Conta le ricorrenze di x"
|
PythonCount = "Conta le ricorrenze di x"
|
||||||
PythonDegrees = "Conversione di radianti in gradi"
|
PythonDegrees = "Conversione di radianti in gradi"
|
||||||
PythonDivMod = "Quoziente e resto"
|
PythonDivMod = "Quoziente e resto"
|
||||||
|
PythonDrawCircle = "Disegnare un cerchio"
|
||||||
PythonDrawLine = "Disegna una linea"
|
PythonDrawLine = "Disegna una linea"
|
||||||
PythonDrawString = "Visualizza il testo dal pixel x,y"
|
PythonDrawString = "Visualizza il testo dal pixel x,y"
|
||||||
PythonErf = "Funzione d'errore"
|
PythonErf = "Funzione d'errore"
|
||||||
@@ -52,13 +59,18 @@ PythonErfc = "Funzione d'errore complementare"
|
|||||||
PythonEval = "Valuta l'espressione nell'argomento "
|
PythonEval = "Valuta l'espressione nell'argomento "
|
||||||
PythonExp = "Funzione esponenziale"
|
PythonExp = "Funzione esponenziale"
|
||||||
PythonExpm1 = "Calcola exp(x)-1"
|
PythonExpm1 = "Calcola exp(x)-1"
|
||||||
|
PythonFactorial = "Fattoriale di x"
|
||||||
PythonFabs = "Valore assoluto"
|
PythonFabs = "Valore assoluto"
|
||||||
|
PythonFillCircle = "Riempire un cerchio"
|
||||||
|
PythonFillPolygon = "Riempire un poligono"
|
||||||
PythonFillRect = "Riempie un rettangolo"
|
PythonFillRect = "Riempie un rettangolo"
|
||||||
PythonFloat = "Conversione in flottanti"
|
PythonFloat = "Conversione in flottanti"
|
||||||
PythonFloor = "Parte intera"
|
PythonFloor = "Parte intera"
|
||||||
PythonFmod = "a modulo b"
|
PythonFmod = "a modulo b"
|
||||||
PythonFrExp = "Mantissa ed esponente di x : (m,e)"
|
PythonFrExp = "Mantissa ed esponente di x : (m,e)"
|
||||||
PythonGamma = "Funzione gamma"
|
PythonGamma = "Funzione gamma"
|
||||||
|
PythonGetKeys = "Ottieni i tasti premuti"
|
||||||
|
PythonGetPalette = "Ottieni la tavolozza del tema"
|
||||||
PythonGetPixel = "Restituisce colore del pixel(x,y)"
|
PythonGetPixel = "Restituisce colore del pixel(x,y)"
|
||||||
PythonGetrandbits = "Numero aleatorio con k bit"
|
PythonGetrandbits = "Numero aleatorio con k bit"
|
||||||
PythonGrid = "Attiva la visibilità della griglia"
|
PythonGrid = "Attiva la visibilità della griglia"
|
||||||
@@ -70,23 +82,85 @@ PythonImportKandinsky = "Importa modulo kandinsky"
|
|||||||
PythonImportRandom = "Importa modulo random"
|
PythonImportRandom = "Importa modulo random"
|
||||||
PythonImportMath = "Importa modulo math"
|
PythonImportMath = "Importa modulo math"
|
||||||
PythonImportMatplotlibPyplot = "Importa modulo matplotlib.pyplot"
|
PythonImportMatplotlibPyplot = "Importa modulo matplotlib.pyplot"
|
||||||
|
PythonImportNumpy = "Importa modulo ulab.numpy"
|
||||||
|
PythonImportScipy = "Importa modulo ulab.scipy"
|
||||||
PythonImportTurtle = "Importa del modulo turtle"
|
PythonImportTurtle = "Importa del modulo turtle"
|
||||||
PythonImportTime = "Importa del modulo time"
|
PythonImportTime = "Importa del modulo time"
|
||||||
PythonImportOs = "Importa modulo os"
|
PythonImportOs = "Importa modulo os"
|
||||||
PythonOsUname = "Ottieni informazioni sul sistema"
|
PythonOsUname = "Ottieni informazioni sul sistema"
|
||||||
|
PythonOsGetlogin = "Ottieni username"
|
||||||
PythonOsRemove = "Rimuovere un file"
|
PythonOsRemove = "Rimuovere un file"
|
||||||
PythonOsRename = "Rinomina file"
|
PythonOsRename = "Rinomina file"
|
||||||
PythonOsListdir = "Elenca file"
|
PythonOsListdir = "Elenca file"
|
||||||
|
PythonImportSys = "Importa modulo sys"
|
||||||
|
PythonSysExit = "Termina programma corrente"
|
||||||
|
PythonSysPrintexception = "Stampa eccezione"
|
||||||
|
PythonSysByteorder = "Ordine di byte del sistema"
|
||||||
|
PythonSysImplementation = "Informazioni su Python"
|
||||||
|
PythonSysModules = "Dizionario dei moduli caricati"
|
||||||
|
PythonSysVersion = "Versione linguaggio Python (stringa)"
|
||||||
|
PythonSysVersioninfo = "Versione linguaggio Python (tupla)"
|
||||||
PythonIndex = "Indice prima occorrenza di x"
|
PythonIndex = "Indice prima occorrenza di x"
|
||||||
PythonInput = "Inserire un valore"
|
PythonInput = "Inserire un valore"
|
||||||
PythonInsert = "Inserire x in posizione i-esima"
|
PythonInsert = "Inserire x in posizione i-esima"
|
||||||
PythonInt = "Conversione in intero"
|
PythonInt = "Conversione in intero"
|
||||||
PythonIonFunction = "Prefisso di funzione modulo ion"
|
PythonIonFunction = "Prefisso di funzione modulo ion"
|
||||||
PythonIsFinite = "Testa se x è finito"
|
PythonIsFinite = "Testa se x è finito"
|
||||||
PythonIsInfinite = "Testa se x est infinito"
|
PythonIsInfinite = "Testa se x è infinito"
|
||||||
PythonIsKeyDown = "Restituisce True premendo tasto k"
|
PythonIsKeyDown = "Restituisce True premendo tasto k"
|
||||||
|
PythonBattery = "Restituisce la tensione della batteria"
|
||||||
|
PythonBatteryLevel = "Restituisce il livello della batteria"
|
||||||
|
PythonBatteryIscharging = "Restituisce se la batteria è in carica"
|
||||||
|
PythonSetBrightness = "Imposta livello di luminosità"
|
||||||
|
PythonGetBrightness = "Ottieni livello di luminosità"
|
||||||
PythonIsNaN = "Testa se x è NaN"
|
PythonIsNaN = "Testa se x è NaN"
|
||||||
PythonKandinskyFunction = "Prefisso funzione modulo kandinsky"
|
PythonKandinskyFunction = "Prefisso funzione modulo kandinsky"
|
||||||
|
PythonKeyLeft = "Tasto FRECCIA SINISTRA"
|
||||||
|
PythonKeyUp = "Tasto FRECCIA ALTO"
|
||||||
|
PythonKeyDown = "Tasto FRECCIA BASSO"
|
||||||
|
PythonKeyRight = "Tasto FRECCIA DESTRA"
|
||||||
|
PythonKeyOk = "Tasto OK"
|
||||||
|
PythonKeyBack = "Tasto INDIETRO"
|
||||||
|
PythonKeyHome = "Tasto CASA"
|
||||||
|
PythonKeyOnOff = "Tasto ON/OFF"
|
||||||
|
PythonKeyShift = "Tasto SHIFT"
|
||||||
|
PythonKeyAlpha = "Tasto ALPHA"
|
||||||
|
PythonKeyXnt = "Tasto X,N,T"
|
||||||
|
PythonKeyVar = "Tasto VAR"
|
||||||
|
PythonKeyToolbox = "Tasto TOOLBOX"
|
||||||
|
PythonKeyBackspace = "Tasto CANCELLA"
|
||||||
|
PythonKeyExp = "Tasto ESPONENZIALE"
|
||||||
|
PythonKeyLn = "Tasto LOGARITMO NEPERIANO"
|
||||||
|
PythonKeyLog = "Tasto LOGARITMO DECIMALE"
|
||||||
|
PythonKeyImaginary = "Tasto I IMMAGINE"
|
||||||
|
PythonKeyComma = "Tasto VIRGOLA"
|
||||||
|
PythonKeyPower = "Tasto POTENZA"
|
||||||
|
PythonKeySine = "Tasto SENO"
|
||||||
|
PythonKeyCosine = "Tasto COSENO"
|
||||||
|
PythonKeyTangent = "Tasto TANGENTE"
|
||||||
|
PythonKeyPi = "Tasto PI"
|
||||||
|
PythonKeySqrt = "Tasto RADICE QUADRATA"
|
||||||
|
PythonKeySquare = "Tasto QUADRATO"
|
||||||
|
PythonKeySeven = "Tasto 7"
|
||||||
|
PythonKeyEight = "Tasto 8"
|
||||||
|
PythonKeyNine = "Tasto 9"
|
||||||
|
PythonKeyLeftParenthesis = "Tasto PARENTESI SINISTRA"
|
||||||
|
PythonKeyRightParenthesis = "Tasto PARENTESI DESTRA"
|
||||||
|
PythonKeyFour = "Tasto 4"
|
||||||
|
PythonKeyFive = "Tasto 5"
|
||||||
|
PythonKeySix = "Tasto 6"
|
||||||
|
PythonKeyMultiplication = "Tasto MOLTIPLICAZIONE"
|
||||||
|
PythonKeyDivision = "Tasto DIVISIONE"
|
||||||
|
PythonKeyOne = "Tasto 1"
|
||||||
|
PythonKeyTwo = "Tasto 2"
|
||||||
|
PythonKeyThree = "Tasto 3"
|
||||||
|
PythonKeyPlus = "Tasto PIÙ"
|
||||||
|
PythonKeyMinus = "Tasto MENO"
|
||||||
|
PythonKeyZero = "Tasto 0"
|
||||||
|
PythonKeyDot = "Tasto PUNTO"
|
||||||
|
PythonKeyEe = "Tasto 10 POTENZA X"
|
||||||
|
PythonKeyAns = "Tasto ANS"
|
||||||
|
PythonKeyExe = "Tasto EXE"
|
||||||
PythonLdexp = "Inversa di frexp : x*(2**i)"
|
PythonLdexp = "Inversa di frexp : x*(2**i)"
|
||||||
PythonLength = "Longhezza di un oggetto"
|
PythonLength = "Longhezza di un oggetto"
|
||||||
PythonLgamma = "Logaritmo della funzione gamma"
|
PythonLgamma = "Logaritmo della funzione gamma"
|
||||||
@@ -99,6 +173,14 @@ PythonMax = "Massimo"
|
|||||||
PythonMin = "Minimo"
|
PythonMin = "Minimo"
|
||||||
PythonModf = "Parti frazionarie e intere"
|
PythonModf = "Parti frazionarie e intere"
|
||||||
PythonMonotonic = "Restituisce il valore dell'orologio"
|
PythonMonotonic = "Restituisce il valore dell'orologio"
|
||||||
|
PythonNumpyFunction = "Prefisso modulo numpy"
|
||||||
|
PythonNumpyFftFunction = "Prefisso modulo numpy.fft"
|
||||||
|
PythonNumpyLinalgFunction = "Prefisso modulo numpy.linalg"
|
||||||
|
PythonScipyFunction = "Prefisso modulo scipy"
|
||||||
|
PythonScipyLinalgFunction = "Prefisso modulo scipy.linalg"
|
||||||
|
PythonScipyOptimizeFunction = "Prefisso modulo scipy.optimize"
|
||||||
|
PythonScipySignalFunction = "Prefisso modulo scipy.signal"
|
||||||
|
PythonScipySpecialFunction = "Prefisso modulo scipy.special"
|
||||||
PythonOct = "Conversione in ottale"
|
PythonOct = "Conversione in ottale"
|
||||||
PythonPhase = "Argomento di z"
|
PythonPhase = "Argomento di z"
|
||||||
PythonPlot = "Disegna y in f. di x come linee"
|
PythonPlot = "Disegna y in f. di x come linee"
|
||||||
@@ -114,7 +196,7 @@ PythonRandrange = "Numero dentro il range(start, stop)"
|
|||||||
PythonRangeStartStop = "Lista da start a stop-1"
|
PythonRangeStartStop = "Lista da start a stop-1"
|
||||||
PythonRangeStop = "Lista da 0 a stop-1"
|
PythonRangeStop = "Lista da 0 a stop-1"
|
||||||
PythonRect = "Converte in coordinate algebriche"
|
PythonRect = "Converte in coordinate algebriche"
|
||||||
PythonRemove = "Cancella la prima x dalla lista"
|
PythonRemove = "Cancella la prima x dalla lista"
|
||||||
PythonReverse = "Inverte gli elementi della lista"
|
PythonReverse = "Inverte gli elementi della lista"
|
||||||
PythonRound = "Arrotondato a n cifre decimali"
|
PythonRound = "Arrotondato a n cifre decimali"
|
||||||
PythonScatter = "Diagramma dispersione y in f. di x"
|
PythonScatter = "Diagramma dispersione y in f. di x"
|
||||||
@@ -124,6 +206,12 @@ PythonShow = "Mostra la figura"
|
|||||||
PythonSin = "Seno"
|
PythonSin = "Seno"
|
||||||
PythonSinh = "Seno iperbolico"
|
PythonSinh = "Seno iperbolico"
|
||||||
PythonSleep = "Sospende l'esecuzione t secondi"
|
PythonSleep = "Sospende l'esecuzione t secondi"
|
||||||
|
PythonLocalTime = "Converti il tempo in tuple"
|
||||||
|
PythonMktime = "Converti tuple in tempo"
|
||||||
|
PythonTime = "Ottieni il timestamp corrente"
|
||||||
|
PythonSetLocaltime = "Imposta il tempo da una tupla"
|
||||||
|
PythonRTCmode = "Ottieni la modalità RTC corrente"
|
||||||
|
PythonSetRTCmode = "Imposta modalità RTC"
|
||||||
PythonSort = "Ordina l'elenco"
|
PythonSort = "Ordina l'elenco"
|
||||||
PythonSqrt = "Radice quadrata"
|
PythonSqrt = "Radice quadrata"
|
||||||
PythonSum = "Somma degli elementi della lista"
|
PythonSum = "Somma degli elementi della lista"
|
||||||
@@ -150,28 +238,28 @@ PythonTurtlePosition = "Fornisce posizione corrente (x,y)"
|
|||||||
PythonTurtleReset = "Azzera il disegno"
|
PythonTurtleReset = "Azzera il disegno"
|
||||||
PythonTurtleRight = "Ruota di a gradi a destra"
|
PythonTurtleRight = "Ruota di a gradi a destra"
|
||||||
PythonTurtleSetheading = "Imposta l'orientamento per a gradi"
|
PythonTurtleSetheading = "Imposta l'orientamento per a gradi"
|
||||||
PythonTurtleSetposition = "Posiziona la tartaruga"
|
|
||||||
PythonTurtleShowturtle = "Mostra la tartaruga"
|
PythonTurtleShowturtle = "Mostra la tartaruga"
|
||||||
PythonTurtleSpeed = "Velocità di disegno (x tra 0 e 10)"
|
PythonTurtleSpeed = "Velocità di disegno (x tra 0 e 10)"
|
||||||
PythonTurtleWrite = "Mostra un testo"
|
PythonTurtleWrite = "Mostra un testo"
|
||||||
PythonUniform = "Numero decimale tra [a,b]"
|
PythonUniform = "Numero decimale tra [a,b]"
|
||||||
PythonImportTime = "Import time module"
|
PythonImportTime = "Importa modulo time"
|
||||||
PythonTimePrefix = "time module function prefix"
|
PythonMonotonic = "Restituisce tempo monotonico"
|
||||||
PythonTimeSleep = "Wait for n second"
|
PythonFileOpen = "Apre un file"
|
||||||
PythonMonotonic = "Return monotonic time"
|
PythonFileSeekable = "Dice se si può usare il cursore su un file"
|
||||||
PythonFileOpen = "Opens a file"
|
PythonFileSeek = "Sposta cursore di un file"
|
||||||
PythonFileSeekable = "Tells if seek can be used on a file"
|
PythonFileTell = "Ottieni posizione del cursore del file"
|
||||||
PythonFileSeek = "Move file's cursor"
|
PythonFileClose = "Chiude un file"
|
||||||
PythonFileTell = "Get file's cursor location"
|
PythonFileClosed = "True se un file è stato chiuso"
|
||||||
PythonFileClose = "Closes a file"
|
PythonFileRead = "Legge fino ai byte di un file"
|
||||||
PythonFileClosed = "True if file was closed"
|
PythonFileWrite = "Scrive b in un file"
|
||||||
PythonFileRead = "Read up to size bytes"
|
PythonFileReadline = "Legge una riga o fino ai byte di un file"
|
||||||
PythonFileWrite = "Write b into file"
|
PythonFileReadlines = "Legge una lista di linee di un file"
|
||||||
PythonFileReadline = "Reads a line or up to size bytes"
|
PythonFileTruncate = "Ridimensiona il file"
|
||||||
PythonFileReadlines = "Reads a list of lines"
|
PythonFileWritelines = "Scrive una lista di linee su file"
|
||||||
PythonFileTruncate = "Resize the file to size"
|
PythonFileName = "Contiene il nome del file"
|
||||||
PythonFileWritelines = "Writes a list of lines"
|
PythonFileMode = "Contiene la modalità di apertura del file"
|
||||||
PythonFileName = "Contains file's name"
|
PythonFileReadable = "Dice se si può leggere sul file"
|
||||||
PythonFileMode = "Contains file's open mode"
|
PythonFileWritable = "Dice se si può scrivere sul file"
|
||||||
PythonFileReadable = "Tells if read can be used on a file"
|
PythonImportUtils = "Importazione di ulab.utils"
|
||||||
PythonFileWritable = "Tells if write can be used on a file"
|
PythonUtilsFunction = "Prefisso funzione del modulo utils"
|
||||||
|
PythonTurtleBgcolor = "Cambia il colore dello sfondo"
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
PythonPound = "Opmerkingen"
|
PythonPound = "Opmerkingen"
|
||||||
PythonPercent = "Modulo"
|
PythonPercent = "Modulo"
|
||||||
|
PythonColon = "Dubbele punt"
|
||||||
|
PythonSemicon = "Puntkomma"
|
||||||
|
PythonExclamationMark = "Uitroepteken"
|
||||||
|
PythonLessThan = "Kleiner dan"
|
||||||
|
PythonGreaterThan = "Groter dan"
|
||||||
|
PythonQuestionMark = "Vraagteken"
|
||||||
Python1J = "Imaginaire i"
|
Python1J = "Imaginaire i"
|
||||||
PythonLF = "Nieuwe regel"
|
PythonLF = "Nieuwe regel"
|
||||||
PythonTab = "Tabulatie"
|
PythonTab = "Tabulatie"
|
||||||
@@ -45,6 +51,7 @@ PythonCosh = "Cosinus hyperbolicus"
|
|||||||
PythonCount = "Tel voorkomen van x"
|
PythonCount = "Tel voorkomen van x"
|
||||||
PythonDegrees = "Zet x om van radialen naar graden"
|
PythonDegrees = "Zet x om van radialen naar graden"
|
||||||
PythonDivMod = "Quotiënt en rest"
|
PythonDivMod = "Quotiënt en rest"
|
||||||
|
PythonDrawCircle = "Teken een cirkel"
|
||||||
PythonDrawLine = "Teken een lijn"
|
PythonDrawLine = "Teken een lijn"
|
||||||
PythonDrawString = "Geef een tekst weer van pixel (x,y)"
|
PythonDrawString = "Geef een tekst weer van pixel (x,y)"
|
||||||
PythonErf = "Error functie"
|
PythonErf = "Error functie"
|
||||||
@@ -52,13 +59,18 @@ PythonErfc = "Complementaire error functie"
|
|||||||
PythonEval = "Geef de geëvalueerde uitdrukking"
|
PythonEval = "Geef de geëvalueerde uitdrukking"
|
||||||
PythonExp = "Exponentiële functie"
|
PythonExp = "Exponentiële functie"
|
||||||
PythonExpm1 = "Bereken exp(x)-1"
|
PythonExpm1 = "Bereken exp(x)-1"
|
||||||
|
PythonFactorial = "faculteit van x"
|
||||||
PythonFabs = "Absolute waarde"
|
PythonFabs = "Absolute waarde"
|
||||||
|
PythonFillCircle = "Vul een cirkel"
|
||||||
|
PythonFillPolygon = "Vul een veelhoek"
|
||||||
PythonFillRect = "Vul een rechthoek bij pixel (x,y)"
|
PythonFillRect = "Vul een rechthoek bij pixel (x,y)"
|
||||||
PythonFloat = "Zet x om in een float"
|
PythonFloat = "Zet x om in een float"
|
||||||
PythonFloor = "Vloer"
|
PythonFloor = "Vloer"
|
||||||
PythonFmod = "a modulo b"
|
PythonFmod = "a modulo b"
|
||||||
PythonFrExp = "Mantisse en exponent van x: (m,e)"
|
PythonFrExp = "Mantisse en exponent van x: (m,e)"
|
||||||
PythonGamma = "Gammafunctie"
|
PythonGamma = "Gammafunctie"
|
||||||
|
PythonGetKeys = "Get toetsen ingedrukt"
|
||||||
|
PythonGetPalette = "Thema palet krijgen"
|
||||||
PythonGetPixel = "Geef pixel (x,y) kleur (rgb)"
|
PythonGetPixel = "Geef pixel (x,y) kleur (rgb)"
|
||||||
PythonGetrandbits = "Integer met k willekeurige bits"
|
PythonGetrandbits = "Integer met k willekeurige bits"
|
||||||
PythonGrid = "Verander zichtbaarheid raster"
|
PythonGrid = "Verander zichtbaarheid raster"
|
||||||
@@ -70,12 +82,24 @@ PythonImportKandinsky = "Importeer kandinsky module"
|
|||||||
PythonImportRandom = "Importeer random module"
|
PythonImportRandom = "Importeer random module"
|
||||||
PythonImportMath = "Importeer math module"
|
PythonImportMath = "Importeer math module"
|
||||||
PythonImportMatplotlibPyplot = "Importeer matplotlib.pyplot module"
|
PythonImportMatplotlibPyplot = "Importeer matplotlib.pyplot module"
|
||||||
|
PythonImportNumpy = "Importeer ulab.numpy module"
|
||||||
|
PythonImportScipy = "Importeer ulab.scipy module"
|
||||||
PythonImportTime = "Importeer time module"
|
PythonImportTime = "Importeer time module"
|
||||||
PythonImportOs = "Importeer os module"
|
PythonImportOs = "Importeer os module"
|
||||||
PythonOsUname = " Krijg systeeminfo"
|
PythonOsUname = " Krijg systeeminfo"
|
||||||
|
PythonOsGetlogin = "Get username"
|
||||||
PythonOsRemove = "Een bestand verwijderen"
|
PythonOsRemove = "Een bestand verwijderen"
|
||||||
PythonOsRename = "Hernoem bestand"
|
PythonOsRename = "Hernoem bestand"
|
||||||
PythonOsListdir = "Lijstbestanden"
|
PythonOsListdir = "Lijstbestanden"
|
||||||
|
PythonImportSys = "Importeer sys module"
|
||||||
|
PythonImportSys = "Importeer sys module"
|
||||||
|
PythonSysExit = "Terminate current program"
|
||||||
|
PythonSysPrintexception = "Print exception"
|
||||||
|
PythonSysByteorder = "The byte order of the system"
|
||||||
|
PythonSysImplementation = "Information about Python"
|
||||||
|
PythonSysModules = "Dictionary of loaded modules"
|
||||||
|
PythonSysVersion = "Python language version (string)"
|
||||||
|
PythonSysVersioninfo = "Python language version (tuple)"
|
||||||
PythonImportTurtle = "Importeer turtle module"
|
PythonImportTurtle = "Importeer turtle module"
|
||||||
PythonIndex = "Index van de eerste x aanwezigheden"
|
PythonIndex = "Index van de eerste x aanwezigheden"
|
||||||
PythonInput = "Wijs een waarde toe"
|
PythonInput = "Wijs een waarde toe"
|
||||||
@@ -85,8 +109,59 @@ PythonIonFunction = "ion module voorvoegsel"
|
|||||||
PythonIsFinite = "Controleer of x eindig is"
|
PythonIsFinite = "Controleer of x eindig is"
|
||||||
PythonIsInfinite = "Controleer of x oneindig is"
|
PythonIsInfinite = "Controleer of x oneindig is"
|
||||||
PythonIsKeyDown = "Geef True als k toets omlaag is"
|
PythonIsKeyDown = "Geef True als k toets omlaag is"
|
||||||
|
PythonBattery = "Return batterijspanning"
|
||||||
|
PythonBatteryLevel = "Batterijniveau teruggeven"
|
||||||
|
PythonBatteryIscharging = "Keer terug als de batterij wordt opgeladen"
|
||||||
|
PythonSetBrightness = "Set brightness level"
|
||||||
|
PythonGetBrightness = "Get brightness level"
|
||||||
PythonIsNaN = "Controleer of x geen getal is"
|
PythonIsNaN = "Controleer of x geen getal is"
|
||||||
PythonKandinskyFunction = "kandinsky module voorvoegsel"
|
PythonKandinskyFunction = "kandinsky module voorvoegsel"
|
||||||
|
PythonKeyLeft = "PIJL NAAR LINKS toets"
|
||||||
|
PythonKeyUp = "PIJL OMHOOG toets"
|
||||||
|
PythonKeyDown = "PIJL OMLAAG toets"
|
||||||
|
PythonKeyRight = "PIJL NAAR RECHTS toets"
|
||||||
|
PythonKeyOk = "OK toets"
|
||||||
|
PythonKeyBack = "TERUG toets"
|
||||||
|
PythonKeyHome = "HOME toets"
|
||||||
|
PythonKeyOnOff = "AAN/UIT toets"
|
||||||
|
PythonKeyShift = "SHIFT toets"
|
||||||
|
PythonKeyAlpha = "ALPHA toets"
|
||||||
|
PythonKeyXnt = "X,N,T toets"
|
||||||
|
PythonKeyVar = "VAR toets"
|
||||||
|
PythonKeyToolbox = "TOOLBOX toets"
|
||||||
|
PythonKeyBackspace = "BACKSPACE toets"
|
||||||
|
PythonKeyExp = "EXPONENTIEEL toets"
|
||||||
|
PythonKeyLn = "NATUURLIJKE LOGARITME toets"
|
||||||
|
PythonKeyLog = "BRIGGSE LOGARITME toets"
|
||||||
|
PythonKeyImaginary = "IMAGINAIRE I toets"
|
||||||
|
PythonKeyComma = "KOMMA toets"
|
||||||
|
PythonKeyPower = "MACHT toets"
|
||||||
|
PythonKeySine = "SINUS toets"
|
||||||
|
PythonKeyCosine = "COSINUS toets"
|
||||||
|
PythonKeyTangent = "TANGENS toets"
|
||||||
|
PythonKeyPi = "PI toets"
|
||||||
|
PythonKeySqrt = "VIERKANTSWORTEL toets"
|
||||||
|
PythonKeySquare = "KWADRAAT toets"
|
||||||
|
PythonKeySeven = "7 toets"
|
||||||
|
PythonKeyEight = "8 toets"
|
||||||
|
PythonKeyNine = "9 toets"
|
||||||
|
PythonKeyLeftParenthesis = "HAAKJE OPENEN toets"
|
||||||
|
PythonKeyRightParenthesis = "HAAKJE SLUITEN toets"
|
||||||
|
PythonKeyFour = "4 toets"
|
||||||
|
PythonKeyFive = "5 toets"
|
||||||
|
PythonKeySix = "6 toets"
|
||||||
|
PythonKeyMultiplication = "VERMENIGVULDIGEN toets"
|
||||||
|
PythonKeyDivision = "DELEN toets"
|
||||||
|
PythonKeyOne = "1 toets"
|
||||||
|
PythonKeyTwo = "2 toets"
|
||||||
|
PythonKeyThree = "3 toets"
|
||||||
|
PythonKeyPlus = "PLUS toets"
|
||||||
|
PythonKeyMinus = "MIN toets"
|
||||||
|
PythonKeyZero = "0 toets"
|
||||||
|
PythonKeyDot = "PUNT toets"
|
||||||
|
PythonKeyEe = "10 TOT DE MACHT X toets"
|
||||||
|
PythonKeyAns = "ANS toets"
|
||||||
|
PythonKeyExe = "EXE toets"
|
||||||
PythonLdexp = "Geeft x*(2**i), inversie van frexp"
|
PythonLdexp = "Geeft x*(2**i), inversie van frexp"
|
||||||
PythonLength = "Lengte van een object"
|
PythonLength = "Lengte van een object"
|
||||||
PythonLgamma = "Log-gammafunctie"
|
PythonLgamma = "Log-gammafunctie"
|
||||||
@@ -99,6 +174,14 @@ PythonMax = "Maximum"
|
|||||||
PythonMin = "Minimum"
|
PythonMin = "Minimum"
|
||||||
PythonModf = "Fractionele en gehele delen van x"
|
PythonModf = "Fractionele en gehele delen van x"
|
||||||
PythonMonotonic = "Waarde van een monotone klok"
|
PythonMonotonic = "Waarde van een monotone klok"
|
||||||
|
PythonNumpyFunction = "numpy module prefix"
|
||||||
|
PythonNumpyFftFunction = "numpy.fft module prefix"
|
||||||
|
PythonNumpyLinalgFunction = "numpy.linalg module prefix"
|
||||||
|
PythonScipyFunction = "scipy module prefix"
|
||||||
|
PythonScipyLinalgFunction = "scipy.linalg module prefix"
|
||||||
|
PythonScipyOptimizeFunction = "scipy.optimize module prefix"
|
||||||
|
PythonScipySignalFunction = "scipy.signal module prefix"
|
||||||
|
PythonScipySpecialFunction = "scipy.special module prefix"
|
||||||
PythonOct = "Integer omzetten naar octaal"
|
PythonOct = "Integer omzetten naar octaal"
|
||||||
PythonPhase = "Fase van z in radialen"
|
PythonPhase = "Fase van z in radialen"
|
||||||
PythonPlot = "Plot y versus x als lijnen"
|
PythonPlot = "Plot y versus x als lijnen"
|
||||||
@@ -121,9 +204,15 @@ PythonScatter = "Teken scatterplot van y versus x"
|
|||||||
PythonSeed = "Start willek. getallengenerator"
|
PythonSeed = "Start willek. getallengenerator"
|
||||||
PythonSetPixel = "Kleur pixel (x,y)"
|
PythonSetPixel = "Kleur pixel (x,y)"
|
||||||
PythonShow = "Figuur weergeven"
|
PythonShow = "Figuur weergeven"
|
||||||
PythonSin= "Sinus"
|
PythonSin = "Sinus"
|
||||||
PythonSinh = "Sinus hyperbolicus"
|
PythonSinh = "Sinus hyperbolicus"
|
||||||
PythonSleep = "Stel executie voor t seconden uit"
|
PythonSleep = "Stel executie voor t seconden uit"
|
||||||
|
PythonLocalTime = "Zet tijd om in tuple"
|
||||||
|
PythonMktime = "Tuple omzetten in tijd"
|
||||||
|
PythonTime = "Haal de huidige tijdstempel"
|
||||||
|
PythonSetLocaltime = "Stel de tijd in vanaf een tuple"
|
||||||
|
PythonRTCmode = "Huidige RTC-modus kregen"
|
||||||
|
PythonSetRTCmode = "RTC-modus instellen"
|
||||||
PythonSort = "Sorteer de lijst"
|
PythonSort = "Sorteer de lijst"
|
||||||
PythonSqrt = "Vierkantswortel"
|
PythonSqrt = "Vierkantswortel"
|
||||||
PythonSum = "Sommeer de items van een lijst"
|
PythonSum = "Sommeer de items van een lijst"
|
||||||
@@ -150,14 +239,11 @@ PythonTurtlePosition = "Zet huidige (x,y) locatie terug"
|
|||||||
PythonTurtleReset = "Reset de tekening"
|
PythonTurtleReset = "Reset de tekening"
|
||||||
PythonTurtleRight = "Ga rechtsaf met a graden"
|
PythonTurtleRight = "Ga rechtsaf met a graden"
|
||||||
PythonTurtleSetheading = "Zet de oriëntatie op a graden"
|
PythonTurtleSetheading = "Zet de oriëntatie op a graden"
|
||||||
PythonTurtleSetposition = "Plaats de schildpad"
|
|
||||||
PythonTurtleShowturtle = "Laat de schildpad zien"
|
PythonTurtleShowturtle = "Laat de schildpad zien"
|
||||||
PythonTurtleSpeed = "Tekensnelheid tussen 0 and 10"
|
PythonTurtleSpeed = "Tekensnelheid tussen 0 and 10"
|
||||||
PythonTurtleWrite = "Display a text"
|
PythonTurtleWrite = "Display a text"
|
||||||
PythonUniform = "Decimaal getal in [a,b]"
|
PythonUniform = "Decimaal getal in [a,b]"
|
||||||
PythonImportTime = "Import time module"
|
PythonImportTime = "Import time module"
|
||||||
PythonTimePrefix = "time module function prefix"
|
|
||||||
PythonTimeSleep = "Wait for n second"
|
|
||||||
PythonMonotonic = "Return monotonic time"
|
PythonMonotonic = "Return monotonic time"
|
||||||
PythonFileOpen = "Opens a file"
|
PythonFileOpen = "Opens a file"
|
||||||
PythonFileSeekable = "Tells if seek can be used on a file"
|
PythonFileSeekable = "Tells if seek can be used on a file"
|
||||||
@@ -175,3 +261,6 @@ PythonFileName = "Contains file's name"
|
|||||||
PythonFileMode = "Contains file's open mode"
|
PythonFileMode = "Contains file's open mode"
|
||||||
PythonFileReadable = "Tells if read can be used on a file"
|
PythonFileReadable = "Tells if read can be used on a file"
|
||||||
PythonFileWritable = "Tells if write can be used on a file"
|
PythonFileWritable = "Tells if write can be used on a file"
|
||||||
|
PythonImportUtils = "Ulab.utils importeren"
|
||||||
|
PythonUtilsFunction = "utils module functie prefix"
|
||||||
|
PythonTurtleBgcolor = "Verander de achtergrondkleur"
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
PythonPound = "Comentário"
|
PythonPound = "Comentário"
|
||||||
PythonPercent = "Módulo"
|
PythonPercent = "Módulo"
|
||||||
|
PythonColon = "Dois pontos"
|
||||||
|
PythonSemicon = "Ponto e vírgula"
|
||||||
|
PythonExclamationMark = "Ponto de exclamação"
|
||||||
|
PythonLessThan = "Menor que"
|
||||||
|
PythonGreaterThan = "Maior que"
|
||||||
|
PythonQuestionMark = "Ponto de interrogação"
|
||||||
Python1J = "i Complexo"
|
Python1J = "i Complexo"
|
||||||
PythonLF = "Nova linha"
|
PythonLF = "Nova linha"
|
||||||
PythonTab = "Tabulação"
|
PythonTab = "Tabulação"
|
||||||
@@ -45,6 +51,7 @@ PythonCosh = "Cosseno hiperbólico"
|
|||||||
PythonCount = "Contar as ocorrências de x"
|
PythonCount = "Contar as ocorrências de x"
|
||||||
PythonDegrees = "Converter x de radianos para graus"
|
PythonDegrees = "Converter x de radianos para graus"
|
||||||
PythonDivMod = "Quociente e resto"
|
PythonDivMod = "Quociente e resto"
|
||||||
|
PythonDrawCircle = "Desenha um círculo"
|
||||||
PythonDrawLine = "Desenhe uma linha"
|
PythonDrawLine = "Desenhe uma linha"
|
||||||
PythonDrawString = "Mostrar o texto do pixel (x,y)"
|
PythonDrawString = "Mostrar o texto do pixel (x,y)"
|
||||||
PythonErf = "Função erro"
|
PythonErf = "Função erro"
|
||||||
@@ -52,13 +59,18 @@ PythonErfc = "Função erro complementar"
|
|||||||
PythonEval = "Devolve a expressão avaliada"
|
PythonEval = "Devolve a expressão avaliada"
|
||||||
PythonExp = "Função exponencial"
|
PythonExp = "Função exponencial"
|
||||||
PythonExpm1 = "Calcular exp(x)-1"
|
PythonExpm1 = "Calcular exp(x)-1"
|
||||||
|
PythonFactorial = "Fatorial de x"
|
||||||
PythonFabs = "Valor absoluto"
|
PythonFabs = "Valor absoluto"
|
||||||
|
PythonFillCircle = "Preencher um círculo"
|
||||||
|
PythonFillPolygon = "Preencher um polígono"
|
||||||
PythonFillRect = "Preencher um retângulo em (x,y)"
|
PythonFillRect = "Preencher um retângulo em (x,y)"
|
||||||
PythonFloat = "Converter x num flutuante"
|
PythonFloat = "Converter x num flutuante"
|
||||||
PythonFloor = "Parte inteira"
|
PythonFloor = "Parte inteira"
|
||||||
PythonFmod = "a módulo b"
|
PythonFmod = "a módulo b"
|
||||||
PythonFrExp = "Coeficiente e expoente de x: (m, e)"
|
PythonFrExp = "Coeficiente e expoente de x: (m, e)"
|
||||||
PythonGamma = "Função gama"
|
PythonGamma = "Função gama"
|
||||||
|
PythonGetKeys = "Obter teclas pressionadas"
|
||||||
|
PythonGetPalette = "Obter paleta temática"
|
||||||
PythonGetPixel = "Devolve a cor do pixel (x,y)"
|
PythonGetPixel = "Devolve a cor do pixel (x,y)"
|
||||||
PythonGetrandbits = "Número inteiro aleatório com k bits"
|
PythonGetrandbits = "Número inteiro aleatório com k bits"
|
||||||
PythonGrid = "Alterar visibilidade da grelha"
|
PythonGrid = "Alterar visibilidade da grelha"
|
||||||
@@ -70,6 +82,8 @@ PythonImportKandinsky = "Importar módulo kandinsky"
|
|||||||
PythonImportRandom = "Importar módulo random"
|
PythonImportRandom = "Importar módulo random"
|
||||||
PythonImportMath = "Importar módulo math"
|
PythonImportMath = "Importar módulo math"
|
||||||
PythonImportMatplotlibPyplot = "Importar módulo matplotlib.pyplot"
|
PythonImportMatplotlibPyplot = "Importar módulo matplotlib.pyplot"
|
||||||
|
PythonImportNumpy = "Importar módulo ulab.numpy"
|
||||||
|
PythonImportScipy = "Importar módulo ulab.scipy"
|
||||||
PythonImportTime = "Importar módulo time"
|
PythonImportTime = "Importar módulo time"
|
||||||
PythonImportTurtle = "Importar módulo turtle"
|
PythonImportTurtle = "Importar módulo turtle"
|
||||||
PythonIndex = "Índice da primeira ocorrência de x"
|
PythonIndex = "Índice da primeira ocorrência de x"
|
||||||
@@ -80,8 +94,59 @@ PythonIonFunction = "Prefixo da função do módulo ion"
|
|||||||
PythonIsFinite = "Verificar se x é finito"
|
PythonIsFinite = "Verificar se x é finito"
|
||||||
PythonIsInfinite = "Verificar se x é infinito"
|
PythonIsInfinite = "Verificar se x é infinito"
|
||||||
PythonIsKeyDown = "Devolve True se tecla k pressionada"
|
PythonIsKeyDown = "Devolve True se tecla k pressionada"
|
||||||
|
PythonBattery = "Retornar a voltagem da bateria"
|
||||||
|
PythonBatteryLevel = "Retornar nível de bateria"
|
||||||
|
PythonBatteryIscharging = "Retorne se a bateria estiver carregando"
|
||||||
|
PythonSetBrightness = "Definir nível de brilho"
|
||||||
|
PythonGetBrightness = "Obter nível de brilho"
|
||||||
PythonIsNaN = "Verificar se x é um NaN"
|
PythonIsNaN = "Verificar se x é um NaN"
|
||||||
PythonKandinskyFunction = "Prefixo da função do módulo kandinsky"
|
PythonKandinskyFunction = "Prefixo da função do módulo kandinsky"
|
||||||
|
PythonKeyLeft = "tecla SETA ESQUERDA"
|
||||||
|
PythonKeyUp = "tecla SETA CIMA "
|
||||||
|
PythonKeyDown = "tecla SETA BAIXO"
|
||||||
|
PythonKeyRight = "tecla SETA DIREITA"
|
||||||
|
PythonKeyOk = "tecla OK"
|
||||||
|
PythonKeyBack = "tecla VOLTAR"
|
||||||
|
PythonKeyHome = "tecla HOME"
|
||||||
|
PythonKeyOnOff = "tecla ON/OFF"
|
||||||
|
PythonKeyShift = "tecla SHIFT"
|
||||||
|
PythonKeyAlpha = "tecla ALPHA"
|
||||||
|
PythonKeyXnt = "tecla X,N,T"
|
||||||
|
PythonKeyVar = "tecla VAR"
|
||||||
|
PythonKeyToolbox = "tecla CAIXA DE FERRAMENTAS"
|
||||||
|
PythonKeyBackspace = "tecla APAGAR"
|
||||||
|
PythonKeyExp = "tecla EXPONENCIAL"
|
||||||
|
PythonKeyLn = "tecla LOGARITMO NATURAL"
|
||||||
|
PythonKeyLog = "tecla LOGARITMO DECIMAL"
|
||||||
|
PythonKeyImaginary = "tecla I IMAGINÁRIO"
|
||||||
|
PythonKeyComma = "tecla VÍRGULA"
|
||||||
|
PythonKeyPower = "tecla EXPOENTE"
|
||||||
|
PythonKeySine = "tecla SENO"
|
||||||
|
PythonKeyCosine = "tecla COSSENO"
|
||||||
|
PythonKeyTangent = "tecla TANGENTE"
|
||||||
|
PythonKeyPi = "tecla PI"
|
||||||
|
PythonKeySqrt = "tecla RAIZ QUADRADA"
|
||||||
|
PythonKeySquare = "tecla AO QUADRADO"
|
||||||
|
PythonKeySeven = "tecla 7"
|
||||||
|
PythonKeyEight = "tecla 8"
|
||||||
|
PythonKeyNine = "tecla 9"
|
||||||
|
PythonKeyLeftParenthesis = "tecla PARÊNTESE ESQUERDO"
|
||||||
|
PythonKeyRightParenthesis = "tecla PARÊNTESE DIREITO"
|
||||||
|
PythonKeyFour = "tecla 4"
|
||||||
|
PythonKeyFive = "tecla 5"
|
||||||
|
PythonKeySix = "tecla 6"
|
||||||
|
PythonKeyMultiplication = "tecla MULTIPLICAÇÃO"
|
||||||
|
PythonKeyDivision = "tecla DIVISÃO"
|
||||||
|
PythonKeyOne = "tecla 1"
|
||||||
|
PythonKeyTwo = "tecla 2"
|
||||||
|
PythonKeyThree = "tecla 3"
|
||||||
|
PythonKeyPlus = "tecla MAIS"
|
||||||
|
PythonKeyMinus = "tecla MENOS"
|
||||||
|
PythonKeyZero = "tecla 0"
|
||||||
|
PythonKeyDot = "tecla PONTO"
|
||||||
|
PythonKeyEe = "tecla 10 expoente X"
|
||||||
|
PythonKeyAns = "tecla ANS"
|
||||||
|
PythonKeyExe = "tecla EXE"
|
||||||
PythonLdexp = "Devolve x*(2**i), inverso de frexp"
|
PythonLdexp = "Devolve x*(2**i), inverso de frexp"
|
||||||
PythonLength = "Comprimento de um objeto"
|
PythonLength = "Comprimento de um objeto"
|
||||||
PythonLgamma = "Logaritmo da função gama"
|
PythonLgamma = "Logaritmo da função gama"
|
||||||
@@ -94,6 +159,14 @@ PythonMax = "Máximo"
|
|||||||
PythonMin = "Mínimo"
|
PythonMin = "Mínimo"
|
||||||
PythonModf = "Partes inteira e frácionária de x"
|
PythonModf = "Partes inteira e frácionária de x"
|
||||||
PythonMonotonic = "Devolve o valor do relógio"
|
PythonMonotonic = "Devolve o valor do relógio"
|
||||||
|
PythonNumpyFunction = "Prefixo do módulo numpy"
|
||||||
|
PythonNumpyFftFunction = "Prefixo do módulo numpy.fft"
|
||||||
|
PythonNumpyLinalgFunction = "Prefixo do módulo numpy.linalg"
|
||||||
|
PythonScipyFunction = "Prefixo do módulo scipy"
|
||||||
|
PythonScipyLinalgFunction = "Prefixo do módulo scipy.linalg"
|
||||||
|
PythonScipyOptimizeFunction = "Prefixo do módulo scipy.optimize"
|
||||||
|
PythonScipySignalFunction = "Prefixo do módulo scipy.signal"
|
||||||
|
PythonScipySpecialFunction = "Prefixo do módulo scipy.special"
|
||||||
PythonOct = "Converter número inteiro em octal"
|
PythonOct = "Converter número inteiro em octal"
|
||||||
PythonPhase = "Argumento de z"
|
PythonPhase = "Argumento de z"
|
||||||
PythonPlot = "Desenhar y em função de x"
|
PythonPlot = "Desenhar y em função de x"
|
||||||
@@ -119,6 +192,12 @@ PythonShow = "Mostrar a figura"
|
|||||||
PythonSin = "Seno"
|
PythonSin = "Seno"
|
||||||
PythonSinh = "Seno hiperbólico"
|
PythonSinh = "Seno hiperbólico"
|
||||||
PythonSleep = "Suspender a execução por t segundos"
|
PythonSleep = "Suspender a execução por t segundos"
|
||||||
|
PythonLocalTime = "Convert o tempo em tupla"
|
||||||
|
PythonMktime = "Convert tuple em tempo"
|
||||||
|
PythonTime = "Obter o estamp de tempo atual"
|
||||||
|
PythonSetLocaltime = "Definir tempo a partir de uma tupla"
|
||||||
|
PythonRTCmode = "Obter o modo RTC atual"
|
||||||
|
PythonSetRTCmode = "Definir o modo RTC"
|
||||||
PythonSort = "Ordenar a lista"
|
PythonSort = "Ordenar a lista"
|
||||||
PythonSqrt = "Raiz quadrada"
|
PythonSqrt = "Raiz quadrada"
|
||||||
PythonSum = "Soma dos itens da lista"
|
PythonSum = "Soma dos itens da lista"
|
||||||
@@ -145,7 +224,6 @@ PythonTurtlePosition = "Devolve a posição atual (x,y)"
|
|||||||
PythonTurtleReset = "Reiniciar o desenho"
|
PythonTurtleReset = "Reiniciar o desenho"
|
||||||
PythonTurtleRight = "Virar à esquerda por a graus"
|
PythonTurtleRight = "Virar à esquerda por a graus"
|
||||||
PythonTurtleSetheading = "Definir a orientação por a graus"
|
PythonTurtleSetheading = "Definir a orientação por a graus"
|
||||||
PythonTurtleSetposition = "Positionne la tortue"
|
|
||||||
PythonTurtleShowturtle = "Mostrar o turtle"
|
PythonTurtleShowturtle = "Mostrar o turtle"
|
||||||
PythonTurtleSpeed = "Velocidade do desenho entre 0 e 10"
|
PythonTurtleSpeed = "Velocidade do desenho entre 0 e 10"
|
||||||
PythonTurtleWrite = "Mostrar um texto"
|
PythonTurtleWrite = "Mostrar um texto"
|
||||||
@@ -153,11 +231,18 @@ PythonUniform = "Número decimal em [a,b]"
|
|||||||
PythonImportTime = "Import time module"
|
PythonImportTime = "Import time module"
|
||||||
PythonImportOs = "Import os module"
|
PythonImportOs = "Import os module"
|
||||||
PythonOsUname = " Obter informações do sistema"
|
PythonOsUname = " Obter informações do sistema"
|
||||||
|
PythonOsGetlogin = "Get username"
|
||||||
PythonOsRemove = "Remover um ficheiro"
|
PythonOsRemove = "Remover um ficheiro"
|
||||||
PythonOsRename = "Renomear ficheiro"
|
PythonOsRename = "Renomear ficheiro"
|
||||||
PythonOsListdir = "Listar ficheiros"
|
PythonOsListdir = "Listar ficheiros"
|
||||||
PythonTimePrefix = "time module function prefix"
|
PythonImportSys = "Import sys module"
|
||||||
PythonTimeSleep = "Wait for n second"
|
PythonSysExit = "Terminate current program"
|
||||||
|
PythonSysPrintexception = "Print exception"
|
||||||
|
PythonSysByteorder = "The byte order of the system"
|
||||||
|
PythonSysImplementation = "Information about Python"
|
||||||
|
PythonSysModules = "Dictionary of loaded modules"
|
||||||
|
PythonSysVersion = "Python language version (string)"
|
||||||
|
PythonSysVersioninfo = "Python language version (tuple)"
|
||||||
PythonMonotonic = "Return monotonic time"
|
PythonMonotonic = "Return monotonic time"
|
||||||
PythonFileOpen = "Opens a file"
|
PythonFileOpen = "Opens a file"
|
||||||
PythonFileSeekable = "Tells if seek can be used on a file"
|
PythonFileSeekable = "Tells if seek can be used on a file"
|
||||||
@@ -175,3 +260,6 @@ PythonFileName = "Contains file's name"
|
|||||||
PythonFileMode = "Contains file's open mode"
|
PythonFileMode = "Contains file's open mode"
|
||||||
PythonFileReadable = "Tells if read can be used on a file"
|
PythonFileReadable = "Tells if read can be used on a file"
|
||||||
PythonFileWritable = "Tells if write can be used on a file"
|
PythonFileWritable = "Tells if write can be used on a file"
|
||||||
|
PythonImportUtils = "Importando ulab.utils"
|
||||||
|
PythonUtilsFunction = "prefixo de função do módulo utils"
|
||||||
|
PythonTurtleBgcolor = "Alterar a cor de fundo"
|
||||||
|
|||||||
@@ -1,6 +1,12 @@
|
|||||||
PythonCommandAmpersand = "&"
|
PythonCommandAmpersand = "&"
|
||||||
PythonCommandLF = "\\n"
|
PythonCommandLF = "\\n"
|
||||||
PythonCommandPercent = "%"
|
PythonCommandPercent = "%"
|
||||||
|
PythonCommandColon = ":"
|
||||||
|
PythonCommandSemicon = ";"
|
||||||
|
PythonCommandExclamationMark = "!"
|
||||||
|
PythonCommandLessThan = "<"
|
||||||
|
PythonCommandGreaterThan = ">"
|
||||||
|
PythonCommandQuestionMark = "?"
|
||||||
PythonCommandPound = "#"
|
PythonCommandPound = "#"
|
||||||
PythonCommandSingleQuote = "'x'"
|
PythonCommandSingleQuote = "'x'"
|
||||||
PythonCommandSymbolExp = "^"
|
PythonCommandSymbolExp = "^"
|
||||||
@@ -50,6 +56,7 @@ PythonCommandCount = "list.count(x)"
|
|||||||
PythonCommandCountWithoutArg = ".count(\x11)"
|
PythonCommandCountWithoutArg = ".count(\x11)"
|
||||||
PythonCommandDegrees = "degrees(x)"
|
PythonCommandDegrees = "degrees(x)"
|
||||||
PythonCommandDivMod = "divmod(a,b)"
|
PythonCommandDivMod = "divmod(a,b)"
|
||||||
|
PythonCommandDrawCircle = "draw_circle(x,y,r,color)"
|
||||||
PythonCommandDrawLine = "draw_line(x1,y1,x2,y2,color)"
|
PythonCommandDrawLine = "draw_line(x1,y1,x2,y2,color)"
|
||||||
PythonCommandDrawString = "draw_string(\"text\",x,y)"
|
PythonCommandDrawString = "draw_string(\"text\",x,y)"
|
||||||
PythonCommandConstantE = "e"
|
PythonCommandConstantE = "e"
|
||||||
@@ -59,13 +66,18 @@ PythonCommandEval = "eval(\"expression\")"
|
|||||||
PythonCommandExp = "exp(x)"
|
PythonCommandExp = "exp(x)"
|
||||||
PythonCommandExpComplex = "exp(z)"
|
PythonCommandExpComplex = "exp(z)"
|
||||||
PythonCommandExpm1 = "expm1(x)"
|
PythonCommandExpm1 = "expm1(x)"
|
||||||
|
PythonCommandFactorial = "factorial(x)"
|
||||||
PythonCommandFabs = "fabs(x)"
|
PythonCommandFabs = "fabs(x)"
|
||||||
|
PythonCommandFillCircle = "fill_circle(x,y,r,color)"
|
||||||
|
PythonCommandFillPolygon = "fill_polygon([(x1,y1),...],color)"
|
||||||
PythonCommandFillRect = "fill_rect(x,y,width,height,color)"
|
PythonCommandFillRect = "fill_rect(x,y,width,height,color)"
|
||||||
PythonCommandFloat = "float(x)"
|
PythonCommandFloat = "float(x)"
|
||||||
PythonCommandFloor = "floor(x)"
|
PythonCommandFloor = "floor(x)"
|
||||||
PythonCommandFmod = "fmod(a,b)"
|
PythonCommandFmod = "fmod(a,b)"
|
||||||
PythonCommandFrExp = "frexp(x)"
|
PythonCommandFrExp = "frexp(x)"
|
||||||
PythonCommandGamma = "gamma(x)"
|
PythonCommandGamma = "gamma(x)"
|
||||||
|
PythonCommandGetKeys = "get_keys()"
|
||||||
|
PythonCommandGetPalette = "get_palette()"
|
||||||
PythonCommandGetPixel = "get_pixel(x,y)"
|
PythonCommandGetPixel = "get_pixel(x,y)"
|
||||||
PythonCommandGetrandbits = "getrandbits(k)"
|
PythonCommandGetrandbits = "getrandbits(k)"
|
||||||
PythonCommandGrid = "grid()"
|
PythonCommandGrid = "grid()"
|
||||||
@@ -86,9 +98,13 @@ PythonCommandImportIon = "import ion"
|
|||||||
PythonCommandImportKandinsky = "import kandinsky"
|
PythonCommandImportKandinsky = "import kandinsky"
|
||||||
PythonCommandImportMath = "import math"
|
PythonCommandImportMath = "import math"
|
||||||
PythonCommandImportMatplotlibPyplot = "import matplotlib.pyplot"
|
PythonCommandImportMatplotlibPyplot = "import matplotlib.pyplot"
|
||||||
|
PythonCommandImportFromNumpy = "from ulab import numpy as np"
|
||||||
|
PythonCommandImportFromScipy = "from ulab import scipy as spy"
|
||||||
PythonCommandImportRandom = "import random"
|
PythonCommandImportRandom = "import random"
|
||||||
PythonCommandImportOs = "import os"
|
PythonCommandImportOs = "import os"
|
||||||
PythonCommandImportFromOs = "from os import *"
|
PythonCommandImportFromOs = "from os import *"
|
||||||
|
PythonCommandImportSys = "import sys"
|
||||||
|
PythonCommandImportFromSys = "from sys import *"
|
||||||
PythonCommandImportTime = "import time"
|
PythonCommandImportTime = "import time"
|
||||||
PythonCommandImportTurtle = "import turtle"
|
PythonCommandImportTurtle = "import turtle"
|
||||||
PythonCommandIndex = "list.index(x)"
|
PythonCommandIndex = "list.index(x)"
|
||||||
@@ -151,6 +167,11 @@ PythonCommandKeyEe = "KEY_EE"
|
|||||||
PythonCommandKeyAns = "KEY_ANS"
|
PythonCommandKeyAns = "KEY_ANS"
|
||||||
PythonCommandKeyExe = "KEY_EXE"
|
PythonCommandKeyExe = "KEY_EXE"
|
||||||
PythonCommandIsKeyDown = "keydown(k)"
|
PythonCommandIsKeyDown = "keydown(k)"
|
||||||
|
PythonCommandBattery = "battery()"
|
||||||
|
PythonCommandBatteryLevel = "battery_level()"
|
||||||
|
PythonCommandBatteryIscharging = "battery_ischarging()"
|
||||||
|
PythonCommandSetBrightness = "set_brightness()"
|
||||||
|
PythonCommandGetBrightness = "get_brightness()"
|
||||||
PythonCommandLdexp = "ldexp(x,i)"
|
PythonCommandLdexp = "ldexp(x,i)"
|
||||||
PythonCommandLength = "len(object)"
|
PythonCommandLength = "len(object)"
|
||||||
PythonCommandLgamma = "lgamma(x)"
|
PythonCommandLgamma = "lgamma(x)"
|
||||||
@@ -166,6 +187,128 @@ PythonCommandMax = "max(list)"
|
|||||||
PythonCommandMin = "min(list)"
|
PythonCommandMin = "min(list)"
|
||||||
PythonCommandModf = "modf(x)"
|
PythonCommandModf = "modf(x)"
|
||||||
PythonCommandMonotonic = "monotonic()"
|
PythonCommandMonotonic = "monotonic()"
|
||||||
|
PythonCommandNumpyArray = "np.array(a)"
|
||||||
|
PythonCommandNumpyArange = "np.arange(i)"
|
||||||
|
PythonCommandNumpyConcatenate = "np.concatenate(a,b)"
|
||||||
|
PythonCommandNumpyDiag = "np.diag(a)"
|
||||||
|
PythonCommandNumpyZeros = "np.zeros(s)"
|
||||||
|
PythonCommandNumpyOnes = "np.ones(s)"
|
||||||
|
PythonCommandNumpyEmpty = "np.empty(s)"
|
||||||
|
PythonCommandNumpyEye = "np.eye(n, m)"
|
||||||
|
PythonCommandNumpyFull = "np.full(s, v)"
|
||||||
|
PythonCommandNumpyLinspace = "np.linspace(s, e)"
|
||||||
|
PythonCommandNumpyLogspace = "np.logspace(s, e)"
|
||||||
|
PythonCommandNumpyCopy = "ndarray.copy()"
|
||||||
|
PythonCommandNumpyCopyWithoutArg = ".copy()"
|
||||||
|
PythonCommandNumpyDtype = "ndarray.dtype"
|
||||||
|
PythonCommandNumpyDtypeWithoutArg = ".dtype"
|
||||||
|
PythonCommandNumpyFlat = "ndarray.flat"
|
||||||
|
PythonCommandNumpyFlatWithoutArg = ".flat"
|
||||||
|
PythonCommandNumpyFlatten = "ndarray.flatten()"
|
||||||
|
PythonCommandNumpyFlattenWithoutArg = ".flatten()"
|
||||||
|
PythonCommandNumpyShape = "ndarray.shape"
|
||||||
|
PythonCommandNumpyShapeWithoutArg = ".shape"
|
||||||
|
PythonCommandNumpyReshape = "ndarray.reshape(s)"
|
||||||
|
PythonCommandNumpyReshapeWithoutArg = ".reshape(\x11)"
|
||||||
|
PythonCommandNumpySize = "ndarray.size"
|
||||||
|
PythonCommandNumpySizeWithoutArg = ".size"
|
||||||
|
PythonCommandNumpyTranspose = "ndarray.transpose()"
|
||||||
|
PythonCommandNumpyTransposeWithoutArg = ".transpose()"
|
||||||
|
PythonCommandNumpySort = "ndarray.sort()"
|
||||||
|
PythonCommandNumpySortWithoutArg = ".sort()"
|
||||||
|
PythonCommandNumpyFromBuffer = "ndarray.frombuffer(b)"
|
||||||
|
PythonCommandNumpyToBytes = "ndarray.tobytes()"
|
||||||
|
PythonCommandNumpyToBytesWithoutArg = ".tobytes()"
|
||||||
|
PythonCommandNumpySetPrintOptions = "np.set_printoptions()"
|
||||||
|
PythonCommandNumpyGetPrintOptions = "np.get_printoptions()"
|
||||||
|
PythonCommandNumpyNdinfo = "np.ndinfo(a)"
|
||||||
|
PythonCommandNumpyAll = "np.all(a)"
|
||||||
|
PythonCommandNumpyAny = "np.any(a)"
|
||||||
|
PythonCommandNumpyArgmax = "np.argmax(a)"
|
||||||
|
PythonCommandNumpyArgmin = "np.argmin(a)"
|
||||||
|
PythonCommandNumpyArgsort = "np.argsort(a)"
|
||||||
|
PythonCommandNumpyClip = "np.clip(a, min, max)"
|
||||||
|
PythonCommandNumpyConvolve = "np.convolve(a, b)"
|
||||||
|
PythonCommandNumpyDiff = "np.diff(a)"
|
||||||
|
PythonCommandNumpyInterp = "np.interp(a)"
|
||||||
|
PythonCommandNumpyDot = "np.dot(a, b)"
|
||||||
|
PythonCommandNumpyCross = "np.cross(a, b)"
|
||||||
|
PythonCommandNumpyEqual = "np.equal(a, b)"
|
||||||
|
PythonCommandNumpyNot_equal = "np.not_equal(a, b)"
|
||||||
|
PythonCommandNumpyFlip = "np.flip(a)"
|
||||||
|
PythonCommandNumpyIsfinite = "np.isfinite(a)"
|
||||||
|
PythonCommandNumpyIsinf = "np.isinf(a)"
|
||||||
|
PythonCommandNumpyMean = "np.mean(a)"
|
||||||
|
PythonCommandNumpyMin = "np.min(a)"
|
||||||
|
PythonCommandNumpyMax = "np.max(a)"
|
||||||
|
PythonCommandNumpyMedian = "np.median(a)"
|
||||||
|
PythonCommandNumpyMinimum = "np.minimum(a, b)"
|
||||||
|
PythonCommandNumpyMaximum = "np.maximum(a, b)"
|
||||||
|
PythonCommandNumpyPolyfit = "np.polyfit(a, b, y)"
|
||||||
|
PythonCommandNumpyPolyval = "np.polyval(p, x)"
|
||||||
|
PythonCommandNumpyRoll = "np.roll(a, n)"
|
||||||
|
PythonCommandNumpySortWithArguments = "np.sort(a)"
|
||||||
|
PythonCommandNumpyStd = "np.std(a)"
|
||||||
|
PythonCommandNumpySum = "np.sum(a)"
|
||||||
|
PythonCommandNumpyTrace = "np.trace(a)"
|
||||||
|
PythonCommandNumpyTrapz = "np.trapz(y)"
|
||||||
|
PythonCommandNumpyWhere = "np.where(c, x, y)"
|
||||||
|
PythonCommandNumpyVectorize = "np.vectorize(f)"
|
||||||
|
PythonCommandNumpyAcos = "np.acos(a)"
|
||||||
|
PythonCommandNumpyAcosh = "np.acosh(a)"
|
||||||
|
PythonCommandNumpyArctan2 = "np.arctan2(a)"
|
||||||
|
PythonCommandNumpyAround = "np.around(a)"
|
||||||
|
PythonCommandNumpyAsin = "np.asin(a)"
|
||||||
|
PythonCommandNumpyAsinh = "np.asinh(a)"
|
||||||
|
PythonCommandNumpyAtan = "np.atan(a)"
|
||||||
|
PythonCommandNumpyAtanh = "np.atanh(a)"
|
||||||
|
PythonCommandNumpyCeil = "np.ceil(a)"
|
||||||
|
PythonCommandNumpyCos = "np.cos(a)"
|
||||||
|
PythonCommandNumpyCosh = "np.cosh(a)"
|
||||||
|
PythonCommandNumpyDegrees = "np.degrees(a)"
|
||||||
|
PythonCommandNumpyExp = "np.exp(a)"
|
||||||
|
PythonCommandNumpyExpm1 = "np.expm1(a)"
|
||||||
|
PythonCommandNumpyFloor = "np.floor(a)"
|
||||||
|
PythonCommandNumpyLog = "np.log(a)"
|
||||||
|
PythonCommandNumpyLog10 = "np.log10(a)"
|
||||||
|
PythonCommandNumpyLog2 = "np.log2(a)"
|
||||||
|
PythonCommandNumpyRadians = "np.radians(a)"
|
||||||
|
PythonCommandNumpySin = "np.sin(a)"
|
||||||
|
PythonCommandNumpySinh = "np.sinh(a)"
|
||||||
|
PythonCommandNumpySqrt = "np.sqrt(a)"
|
||||||
|
PythonCommandNumpyTan = "np.tan(a)"
|
||||||
|
PythonCommandNumpyTanh = "np.tanh(a)"
|
||||||
|
PythonCommandNumpyBool = "np.bool"
|
||||||
|
PythonCommandNumpyFloat = "np.float"
|
||||||
|
PythonCommandNumpyUint8 = "np.uint8"
|
||||||
|
PythonCommandNumpyInt8 = "np.int8"
|
||||||
|
PythonCommandNumpyUint16 = "np.uint16"
|
||||||
|
PythonCommandNumpyInt16 = "np.int16"
|
||||||
|
PythonCommandNumpyNan = "np.nan"
|
||||||
|
PythonCommandNumpyInf = "np.inf"
|
||||||
|
PythonCommandNumpyE = "np.e"
|
||||||
|
PythonCommandNumpyPi = "np.pi"
|
||||||
|
PythonCommandNumpyFft = "np.fft.fft(a)"
|
||||||
|
PythonCommandNumpyIfft = "np.fft.ifft(a)"
|
||||||
|
PythonCommandNumpyDet = "np.linalg.det(a)"
|
||||||
|
PythonCommandNumpyEig = "np.linalg.eig(a)"
|
||||||
|
PythonCommandNumpyCholesky = "np.linalg.cholesky(a)"
|
||||||
|
PythonCommandNumpyInv = "np.linalg.inv(a)"
|
||||||
|
PythonCommandNumpyNorm = "np.linalg.norm(a)"
|
||||||
|
PythonCommandNumpyFunction = "np.function"
|
||||||
|
PythonCommandNumpyFunctionWithoutArg = "np.\x11"
|
||||||
|
PythonCommandNumpyFftFunction = "np.fft.function"
|
||||||
|
PythonCommandNumpyFftFunctionWithoutArg = "np.fft.\x11"
|
||||||
|
PythonCommandNumpyLinalgFunction = "np.linalg.function"
|
||||||
|
PythonCommandNumpyLinalgFunctionWithoutArg = "np.linalg.\x11"
|
||||||
|
PythonCommandImportFromUtils = "from ulab import utils"
|
||||||
|
PythonCommandUtilsFunction = "utils.function"
|
||||||
|
PythonCommandUtilsFunctionWithoutArg = "utils.\x11"
|
||||||
|
PythonCommandUtilsSpectrogram = "spectrogram(a)"
|
||||||
|
PythonCommandUtilsFromInt16Buffer = "from_int16_buffer(b)"
|
||||||
|
PythonCommandUtilsFromUint16Buffer = "from_uint16_buffer(b)"
|
||||||
|
PythonCommandUtilsFromInt32Buffer = "from_int32_buffer(b)"
|
||||||
|
PythonCommandUtilsFromUint32Buffer = "from_uint32_buffer(b)"
|
||||||
PythonCommandOct = "oct(x)"
|
PythonCommandOct = "oct(x)"
|
||||||
PythonCommandPhase = "phase(z)"
|
PythonCommandPhase = "phase(z)"
|
||||||
PythonCommandPlot = "plot(x,y,color)"
|
PythonCommandPlot = "plot(x,y,color)"
|
||||||
@@ -192,12 +335,39 @@ PythonCommandReverseWithoutArg = ".reverse()"
|
|||||||
PythonCommandRound = "round(x,n)"
|
PythonCommandRound = "round(x,n)"
|
||||||
PythonCommandScatter = "scatter(x,y)"
|
PythonCommandScatter = "scatter(x,y)"
|
||||||
PythonCommandSeed = "seed(x)"
|
PythonCommandSeed = "seed(x)"
|
||||||
|
PythonCommandScipyFunction = "spy.function"
|
||||||
|
PythonCommandScipyFunctionWithoutArg = "spy.\x11"
|
||||||
|
PythonCommandScipyLinalgFunction = "spy.linalg.function"
|
||||||
|
PythonCommandScipyLinalgFunctionWithoutArg = "spy.linalg.\x11"
|
||||||
|
PythonCommandScipyOptimizeFunction = "spy.optimize.function"
|
||||||
|
PythonCommandScipyOptimizeFunctionWithoutArg = "spy.optimize.\x11"
|
||||||
|
PythonCommandScipySignalFunction = "spy.signal.function"
|
||||||
|
PythonCommandScipySignalFunctionWithoutArg = "spy.signal.\x11"
|
||||||
|
PythonCommandScipySpecialFunction = "spy.special.function"
|
||||||
|
PythonCommandScipySpecialFunctionWithoutArg = "spy.special.\x11"
|
||||||
|
PythonCommandScipyLinalgChoSolve = "spy.linalg.cho_solve(a, b)"
|
||||||
|
PythonCommandScipyLinalgSolveTriangular = "spy.linalg.solve_triangular(a, b)"
|
||||||
|
PythonCommandScipyOptimizeBisect = "spy.optimize.bisect(f, a, b)"
|
||||||
|
PythonCommandScipyOptimizeFmin = "spy.optimize.fmin(f, x0)"
|
||||||
|
PythonCommandScipyOptimizeNewton = "spy.optimize.newton(f, x0)"
|
||||||
|
PythonCommandScipySignalSosfilt = "spy.signal.sosfilt(sos, x)"
|
||||||
|
PythonCommandScipySignalSpectrogram = "spy.signal.spectrogram(y)"
|
||||||
|
PythonCommandScipySpecialErf = "spy.erf(a)"
|
||||||
|
PythonCommandScipySpecialErfc = "spy.erfc(a)"
|
||||||
|
PythonCommandScipySpecialGamma = "spy.gamma(a)"
|
||||||
|
PythonCommandScipySpecialGammaln = "spy.gammaln(a)"
|
||||||
PythonCommandSetPixel = "set_pixel(x,y,color)"
|
PythonCommandSetPixel = "set_pixel(x,y,color)"
|
||||||
PythonCommandShow = "show()"
|
PythonCommandShow = "show()"
|
||||||
PythonCommandSin = "sin(x)"
|
PythonCommandSin = "sin(x)"
|
||||||
PythonCommandSinComplex = "sin(z)"
|
PythonCommandSinComplex = "sin(z)"
|
||||||
PythonCommandSinh = "sinh(x)"
|
PythonCommandSinh = "sinh(x)"
|
||||||
PythonCommandSleep = "sleep(t)"
|
PythonCommandSleep = "sleep(t)"
|
||||||
|
PythonCommandLocalTime = "localtime([timestamp])"
|
||||||
|
PythonCommandMktime = "mktime(tm)"
|
||||||
|
PythonCommandTime = "time()"
|
||||||
|
PythonCommandSetLocaltime = "setlocaltime(tm)"
|
||||||
|
PythonCommandRTCmode = "rtcmode()"
|
||||||
|
PythonCommandSetRTCmode = "setrtcmode(mode)"
|
||||||
PythonCommandSort = "list.sort()"
|
PythonCommandSort = "list.sort()"
|
||||||
PythonCommandSortWithoutArg = ".sort()"
|
PythonCommandSortWithoutArg = ".sort()"
|
||||||
PythonCommandSorted = "sorted(list)"
|
PythonCommandSorted = "sorted(list)"
|
||||||
@@ -216,15 +386,25 @@ PythonCommandUniform = "uniform(a,b)"
|
|||||||
PythonConstantE = "2.718281828459045"
|
PythonConstantE = "2.718281828459045"
|
||||||
PythonConstantPi = "3.141592653589793"
|
PythonConstantPi = "3.141592653589793"
|
||||||
PythonOsCommandUname = "uname()"
|
PythonOsCommandUname = "uname()"
|
||||||
|
PythonOsCommandGetlogin = "getlogin()"
|
||||||
PythonOsCommandRemove = "remove(filename)"
|
PythonOsCommandRemove = "remove(filename)"
|
||||||
PythonOsCommandRename = "rename(oldname, newname)"
|
PythonOsCommandRename = "rename(oldname, newname)"
|
||||||
PythonOsCommandRemoveWithoutArg = "remove(\x11)"
|
PythonOsCommandRemoveWithoutArg = "remove(\x11)"
|
||||||
PythonOsCommandRenameWithoutArg = "rename(\x11,)"
|
PythonOsCommandRenameWithoutArg = "rename(\x11,)"
|
||||||
PythonOsCommandListdir = "listdir()"
|
PythonOsCommandListdir = "listdir()"
|
||||||
|
PythonSysCommandExit = "exit()"
|
||||||
|
PythonSysCommandPrintexception = "print_exception(exc)"
|
||||||
|
PythonSysCommandPrintexceptionWithoutArg = "print_exception(\x11)"
|
||||||
|
PythonSysCommandByteorder = "byteorder"
|
||||||
|
PythonSysCommandImplementation = "implementation"
|
||||||
|
PythonSysCommandModules = "modules"
|
||||||
|
PythonSysCommandVersion = "version"
|
||||||
|
PythonSysCommandVersioninfo = "version_info"
|
||||||
PythonTurtleCommandBackward = "backward(x)"
|
PythonTurtleCommandBackward = "backward(x)"
|
||||||
PythonTurtleCommandCircle = "circle(r)"
|
PythonTurtleCommandCircle = "circle(r)"
|
||||||
PythonTurtleCommandColor = "color('c')"
|
PythonTurtleCommandColor = "color('c')"
|
||||||
PythonTurtleCommandColorMode = "colormode(x)"
|
PythonTurtleCommandColorMode = "colormode(x)"
|
||||||
|
PythonTurtleCommandBgcolor = "bgcolor('c')"
|
||||||
PythonTurtleCommandForward = "forward(x)"
|
PythonTurtleCommandForward = "forward(x)"
|
||||||
PythonTurtleCommandGoto = "goto(x,y)"
|
PythonTurtleCommandGoto = "goto(x,y)"
|
||||||
PythonTurtleCommandHeading = "heading()"
|
PythonTurtleCommandHeading = "heading()"
|
||||||
@@ -238,16 +418,8 @@ PythonTurtleCommandPosition = "position()"
|
|||||||
PythonTurtleCommandReset = "reset()"
|
PythonTurtleCommandReset = "reset()"
|
||||||
PythonTurtleCommandRight = "right(a)"
|
PythonTurtleCommandRight = "right(a)"
|
||||||
PythonTurtleCommandSetheading = "setheading(a)"
|
PythonTurtleCommandSetheading = "setheading(a)"
|
||||||
PythonTurtleCommandSetposition = "setposition(x,[y])"
|
|
||||||
PythonTurtleCommandShowturtle = "showturtle()"
|
PythonTurtleCommandShowturtle = "showturtle()"
|
||||||
PythonTurtleCommandSpeed = "speed(x)"
|
PythonTurtleCommandSpeed = "speed(x)"
|
||||||
PythonTurtleCommandWhite = "'white'"
|
|
||||||
PythonTurtleCommandYellow = "'yellow'"
|
|
||||||
PythonTimeModule = "time"
|
|
||||||
PythonTimeCommandImportFrom = "from time import *"
|
|
||||||
PythonTimeCommandSleep = "sleep()"
|
|
||||||
PythonTimeCommandSleepDemo = "sleep(n)"
|
|
||||||
PythonTimeCommandMonotonic = "monotonic()"
|
|
||||||
PythonCommandFileOpen = "open(name, [mode])"
|
PythonCommandFileOpen = "open(name, [mode])"
|
||||||
PythonCommandFileOpenWithoutArg = "open(\x11)"
|
PythonCommandFileOpenWithoutArg = "open(\x11)"
|
||||||
PythonCommandFileSeek = "file.seek(offset, [whence])"
|
PythonCommandFileSeek = "file.seek(offset, [whence])"
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ void ConsoleLineCell::ScrollableConsoleLineView::ConsoleLineView::setLine(Consol
|
|||||||
|
|
||||||
void ConsoleLineCell::ScrollableConsoleLineView::ConsoleLineView::drawRect(KDContext * ctx, KDRect rect) const {
|
void ConsoleLineCell::ScrollableConsoleLineView::ConsoleLineView::drawRect(KDContext * ctx, KDRect rect) const {
|
||||||
ctx->fillRect(bounds(), Palette::CodeBackground);
|
ctx->fillRect(bounds(), Palette::CodeBackground);
|
||||||
ctx->drawString(m_line->text(), KDPointZero, GlobalPreferences::sharedGlobalPreferences()->font(), textColor(m_line), isHighlighted()? Palette::Select : Palette::BackgroundApps);
|
ctx->drawString(m_line->text(), KDPointZero, GlobalPreferences::sharedGlobalPreferences()->font(), textColor(m_line), isHighlighted()? Palette::Select : Palette::CodeBackground);
|
||||||
}
|
}
|
||||||
|
|
||||||
KDSize ConsoleLineCell::ScrollableConsoleLineView::ConsoleLineView::minimalSizeForOptimalDisplay() const {
|
KDSize ConsoleLineCell::ScrollableConsoleLineView::ConsoleLineView::minimalSizeForOptimalDisplay() const {
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
#include "app.h"
|
#include "app.h"
|
||||||
#include <escher/metric.h>
|
#include <escher/metric.h>
|
||||||
#include <ion.h>
|
#include <ion.h>
|
||||||
|
#include "../global_preferences.h"
|
||||||
|
#include <apps/apps_container.h>
|
||||||
|
|
||||||
using namespace Shared;
|
using namespace Shared;
|
||||||
|
|
||||||
@@ -71,6 +73,10 @@ void EditorController::viewDidDisappear() {
|
|||||||
m_menuController->scriptContentEditionDidFinish();
|
m_menuController->scriptContentEditionDidFinish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EditorController::textAreaDidReceiveNoneXNTEvent() {
|
||||||
|
AppsContainer::sharedAppsContainer()->resetXNT();
|
||||||
|
}
|
||||||
|
|
||||||
bool EditorController::textAreaDidReceiveEvent(TextArea * textArea, Ion::Events::Event event) {
|
bool EditorController::textAreaDidReceiveEvent(TextArea * textArea, Ion::Events::Event event) {
|
||||||
if (App::app()->textInputDidReceiveEvent(textArea, event)) {
|
if (App::app()->textInputDidReceiveEvent(textArea, event)) {
|
||||||
return true;
|
return true;
|
||||||
@@ -80,7 +86,6 @@ bool EditorController::textAreaDidReceiveEvent(TextArea * textArea, Ion::Events:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (event == Ion::Events::Backspace && textArea->selectionIsEmpty()) {
|
if (event == Ion::Events::Backspace && textArea->selectionIsEmpty()) {
|
||||||
/* If the cursor is on the left of the text of a line, backspace one
|
/* If the cursor is on the left of the text of a line, backspace one
|
||||||
* indentation space at a time. */
|
* indentation space at a time. */
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ public:
|
|||||||
TELEMETRY_ID("Editor");
|
TELEMETRY_ID("Editor");
|
||||||
|
|
||||||
/* TextAreaDelegate */
|
/* TextAreaDelegate */
|
||||||
|
void textAreaDidReceiveNoneXNTEvent() override;
|
||||||
bool textAreaDidReceiveEvent(TextArea * textArea, Ion::Events::Event event) override;
|
bool textAreaDidReceiveEvent(TextArea * textArea, Ion::Events::Event event) override;
|
||||||
|
|
||||||
/* InputEventHandlerDelegate */
|
/* InputEventHandlerDelegate */
|
||||||
|
|||||||
@@ -26,7 +26,9 @@ void EditorView::resetSelection() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EditorView::scrollViewDidChangeOffset(ScrollViewDataSource * scrollViewDataSource) {
|
void EditorView::scrollViewDidChangeOffset(ScrollViewDataSource * scrollViewDataSource) {
|
||||||
m_gutterView.setOffset(scrollViewDataSource->offset().y());
|
if (m_gutterView.setOffsetAndNeedResize(scrollViewDataSource->offset().y())) {
|
||||||
|
internalLayoutSubviews(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
View * EditorView::subviewAtIndex(int index) {
|
View * EditorView::subviewAtIndex(int index) {
|
||||||
@@ -42,8 +44,12 @@ void EditorView::didBecomeFirstResponder() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EditorView::layoutSubviews(bool force) {
|
void EditorView::layoutSubviews(bool force) {
|
||||||
m_gutterView.setOffset(0);
|
m_gutterView.setOffsetAndNeedResize(0); // Whatever the return is, we layout the editor view
|
||||||
KDCoordinate gutterWidth = m_gutterView.minimalSizeForOptimalDisplay().width();
|
internalLayoutSubviews(force);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditorView::internalLayoutSubviews(bool force) {
|
||||||
|
KDCoordinate gutterWidth = m_gutterView.computeWidth();
|
||||||
m_gutterView.setFrame(KDRect(0, 0, gutterWidth, bounds().height()), force);
|
m_gutterView.setFrame(KDRect(0, 0, gutterWidth, bounds().height()), force);
|
||||||
|
|
||||||
m_textArea.setFrame(KDRect(
|
m_textArea.setFrame(KDRect(
|
||||||
@@ -67,23 +73,23 @@ void EditorView::GutterView::drawRect(KDContext * ctx, KDRect rect) const {
|
|||||||
KDCoordinate firstLine = m_offset / glyphSize.height();
|
KDCoordinate firstLine = m_offset / glyphSize.height();
|
||||||
KDCoordinate firstLinePixelOffset = m_offset - firstLine * glyphSize.height();
|
KDCoordinate firstLinePixelOffset = m_offset - firstLine * glyphSize.height();
|
||||||
|
|
||||||
char lineNumber[k_lineNumberCharLength];
|
char lineNumberBuffer[m_numberOfDigits + 1];
|
||||||
int numberOfLines = bounds().height() / glyphSize.height() + 1;
|
int numberOfLines = bounds().height() / glyphSize.height() + 1;
|
||||||
for (int i=0; i<numberOfLines; i++) {
|
for (int i=0; i<numberOfLines; i++) {
|
||||||
// Only the first two digits are displayed
|
int lineNumberValue = (i + firstLine + 1);
|
||||||
int lineNumberValue = (i + firstLine + 1) % 100;
|
|
||||||
Poincare::Integer line(lineNumberValue);
|
Poincare::Integer line(lineNumberValue);
|
||||||
if (firstLine < 10 || lineNumberValue >= 10) {
|
|
||||||
line.serialize(lineNumber, k_lineNumberCharLength);
|
int lineDigits = computeNumberOfDigitsFor(lineNumberValue);
|
||||||
} else {
|
|
||||||
// Add a leading "0"
|
for (int j=0; j < m_numberOfDigits - lineDigits; j++) {
|
||||||
lineNumber[0] = '0';
|
lineNumberBuffer[j] = ' ';
|
||||||
line.serialize(lineNumber + 1, k_lineNumberCharLength - 1);
|
|
||||||
}
|
}
|
||||||
KDCoordinate leftPadding = (2 - strlen(lineNumber)) * glyphSize.width();
|
|
||||||
|
line.serialize(lineNumberBuffer + (m_numberOfDigits - lineDigits), m_numberOfDigits + 1);
|
||||||
|
|
||||||
ctx->drawString(
|
ctx->drawString(
|
||||||
lineNumber,
|
lineNumberBuffer,
|
||||||
KDPoint(k_margin + leftPadding, i*glyphSize.height() - firstLinePixelOffset),
|
KDPoint(k_margin, i*glyphSize.height() - firstLinePixelOffset),
|
||||||
m_font,
|
m_font,
|
||||||
textColor,
|
textColor,
|
||||||
backgroundColor
|
backgroundColor
|
||||||
@@ -91,18 +97,36 @@ void EditorView::GutterView::drawRect(KDContext * ctx, KDRect rect) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorView::GutterView::setOffset(KDCoordinate offset) {
|
bool EditorView::GutterView::setOffsetAndNeedResize(KDCoordinate offset) {
|
||||||
if (m_offset == offset) {
|
if (m_offset == offset) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
m_offset = offset;
|
m_offset = offset;
|
||||||
|
|
||||||
|
int numberOfDigits = computeMaxNumberOfDigits();
|
||||||
|
if (numberOfDigits != m_numberOfDigits) {
|
||||||
|
m_numberOfDigits = numberOfDigits;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
markRectAsDirty(bounds());
|
markRectAsDirty(bounds());
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int EditorView::GutterView::computeWidth() {
|
||||||
|
return 2 * k_margin + (m_numberOfDigits) * m_font->glyphSize().width();
|
||||||
|
}
|
||||||
|
|
||||||
KDSize EditorView::GutterView::minimalSizeForOptimalDisplay() const {
|
int EditorView::GutterView::computeMaxNumberOfDigits() {
|
||||||
int numberOfChars = 2; // TODO: Could be computed
|
return computeNumberOfDigitsFor((bounds().height() / m_font->glyphSize().height() + 1) + (m_offset / m_font->glyphSize().height()));
|
||||||
return KDSize(2 * k_margin + numberOfChars * Poincare::Preferences::sharedPreferences()->KDPythonFont()->glyphSize().width(), 0);
|
}
|
||||||
|
|
||||||
|
int EditorView::GutterView::computeNumberOfDigitsFor(int value) {
|
||||||
|
int digits = 1;
|
||||||
|
while (value >= pow(10, digits)) {
|
||||||
|
digits++;
|
||||||
|
}
|
||||||
|
return digits;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ public:
|
|||||||
void unloadSyntaxHighlighter() { m_textArea.unloadSyntaxHighlighter(); };
|
void unloadSyntaxHighlighter() { m_textArea.unloadSyntaxHighlighter(); };
|
||||||
void scrollViewDidChangeOffset(ScrollViewDataSource * scrollViewDataSource) override;
|
void scrollViewDidChangeOffset(ScrollViewDataSource * scrollViewDataSource) override;
|
||||||
void didBecomeFirstResponder() override;
|
void didBecomeFirstResponder() override;
|
||||||
|
void internalLayoutSubviews(bool force);
|
||||||
private:
|
private:
|
||||||
int numberOfSubviews() const override { return 2; }
|
int numberOfSubviews() const override { return 2; }
|
||||||
View * subviewAtIndex(int index) override;
|
View * subviewAtIndex(int index) override;
|
||||||
@@ -36,15 +37,21 @@ private:
|
|||||||
|
|
||||||
class GutterView : public View {
|
class GutterView : public View {
|
||||||
public:
|
public:
|
||||||
GutterView(const KDFont * font) : View(), m_font(font), m_offset(0) {}
|
GutterView(const KDFont * font) : View(), m_font(font), m_offset(0), m_numberOfDigits(2) {}
|
||||||
|
|
||||||
void drawRect(KDContext * ctx, KDRect rect) const override;
|
void drawRect(KDContext * ctx, KDRect rect) const override;
|
||||||
void setOffset(KDCoordinate offset);
|
bool setOffsetAndNeedResize(KDCoordinate offset); // Return true if the gutter view need to be resized
|
||||||
KDSize minimalSizeForOptimalDisplay() const override;
|
|
||||||
|
int computeWidth();
|
||||||
|
int computeMaxNumberOfDigits();
|
||||||
|
static int computeNumberOfDigitsFor(int value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr KDCoordinate k_margin = 2;
|
static constexpr KDCoordinate k_margin = 2;
|
||||||
static constexpr int k_lineNumberCharLength = 3;
|
|
||||||
const KDFont * m_font;
|
const KDFont * m_font;
|
||||||
KDCoordinate m_offset;
|
KDCoordinate m_offset;
|
||||||
|
int m_numberOfDigits;
|
||||||
};
|
};
|
||||||
|
|
||||||
PythonTextArea m_textArea;
|
PythonTextArea m_textArea;
|
||||||
|
|||||||
@@ -10,9 +10,6 @@ const char * PythonTextForEvent(Ion::Events::Event event) {
|
|||||||
if (event.text() == pair.firstString()) {
|
if (event.text() == pair.firstString()) {
|
||||||
return pair.secondString();
|
return pair.secondString();
|
||||||
}
|
}
|
||||||
if (event == Ion::Events::XNT) {
|
|
||||||
return "x";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,6 +90,11 @@ bool MenuController::handleEvent(Ion::Events::Event event) {
|
|||||||
footer()->setSelectedButton(0);
|
footer()->setSelectedButton(0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (event == Ion::Events::ShiftBack) {
|
||||||
|
Ion::Storage::sharedStorage()->reinsertTrash("py");
|
||||||
|
m_selectableTableView.reloadData();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (event == Ion::Events::Up) {
|
if (event == Ion::Events::Up) {
|
||||||
if (footer()->selectedButton() == 0) {
|
if (footer()->selectedButton() == 0) {
|
||||||
footer()->setSelectedButton(-1);
|
footer()->setSelectedButton(-1);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include <escher/palette.h>
|
#include <escher/palette.h>
|
||||||
#include <ion/unicode/utf8_helper.h>
|
#include <ion/unicode/utf8_helper.h>
|
||||||
#include <python/port/port.h>
|
#include <python/port/port.h>
|
||||||
|
#include "../global_preferences.h"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include "py/nlr.h"
|
#include "py/nlr.h"
|
||||||
@@ -23,7 +24,20 @@ constexpr KDColor BackgroundColor = Palette::CodeBackground;
|
|||||||
constexpr KDColor HighlightColor = Palette::CodeBackgroundSelected;
|
constexpr KDColor HighlightColor = Palette::CodeBackgroundSelected;
|
||||||
constexpr KDColor AutocompleteColor = KDColor::RGB24(0xC6C6C6); // TODO Palette change
|
constexpr KDColor AutocompleteColor = KDColor::RGB24(0xC6C6C6); // TODO Palette change
|
||||||
|
|
||||||
|
bool isItalic(mp_token_kind_t tokenKind) {
|
||||||
|
if (!GlobalPreferences::sharedGlobalPreferences()->syntaxhighlighting()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (tokenKind == MP_TOKEN_STRING) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static inline KDColor TokenColor(mp_token_kind_t tokenKind) {
|
static inline KDColor TokenColor(mp_token_kind_t tokenKind) {
|
||||||
|
if (!GlobalPreferences::sharedGlobalPreferences()->syntaxhighlighting()) {
|
||||||
|
return Palette::CodeText;
|
||||||
|
}
|
||||||
if (tokenKind == MP_TOKEN_STRING) {
|
if (tokenKind == MP_TOKEN_STRING) {
|
||||||
return StringColor;
|
return StringColor;
|
||||||
}
|
}
|
||||||
@@ -65,7 +79,8 @@ static inline KDColor TokenColor(mp_token_kind_t tokenKind) {
|
|||||||
&& MP_TOKEN_KW_TRY + 1 == MP_TOKEN_KW_WHILE
|
&& MP_TOKEN_KW_TRY + 1 == MP_TOKEN_KW_WHILE
|
||||||
&& MP_TOKEN_KW_WHILE + 1 == MP_TOKEN_KW_WITH
|
&& MP_TOKEN_KW_WHILE + 1 == MP_TOKEN_KW_WITH
|
||||||
&& MP_TOKEN_KW_WITH + 1 == MP_TOKEN_KW_YIELD
|
&& MP_TOKEN_KW_WITH + 1 == MP_TOKEN_KW_YIELD
|
||||||
&& MP_TOKEN_KW_YIELD + 1 == MP_TOKEN_OP_TILDE,
|
&& MP_TOKEN_KW_YIELD + 1 == MP_TOKEN_OP_ASSIGN
|
||||||
|
&& MP_TOKEN_OP_ASSIGN + 1 == MP_TOKEN_OP_TILDE,
|
||||||
"MP_TOKEN order changed, so Code::PythonTextArea::TokenColor might need to change too.");
|
"MP_TOKEN order changed, so Code::PythonTextArea::TokenColor might need to change too.");
|
||||||
if (tokenKind >= MP_TOKEN_KW_FALSE && tokenKind <= MP_TOKEN_KW_YIELD) {
|
if (tokenKind >= MP_TOKEN_KW_FALSE && tokenKind <= MP_TOKEN_KW_YIELD) {
|
||||||
return KeywordColor;
|
return KeywordColor;
|
||||||
@@ -118,7 +133,8 @@ static inline KDColor TokenColor(mp_token_kind_t tokenKind) {
|
|||||||
|
|
||||||
if ((tokenKind >= MP_TOKEN_OP_TILDE && tokenKind <= MP_TOKEN_DEL_DBL_STAR_EQUAL)
|
if ((tokenKind >= MP_TOKEN_OP_TILDE && tokenKind <= MP_TOKEN_DEL_DBL_STAR_EQUAL)
|
||||||
|| tokenKind == MP_TOKEN_DEL_EQUAL
|
|| tokenKind == MP_TOKEN_DEL_EQUAL
|
||||||
|| tokenKind == MP_TOKEN_DEL_MINUS_MORE)
|
|| tokenKind == MP_TOKEN_DEL_MINUS_MORE
|
||||||
|
|| tokenKind == MP_TOKEN_OP_ASSIGN)
|
||||||
{
|
{
|
||||||
return OperatorColor;
|
return OperatorColor;
|
||||||
}
|
}
|
||||||
@@ -156,7 +172,7 @@ PythonTextArea::AutocompletionType PythonTextArea::autocompletionType(const char
|
|||||||
const char * tokenEnd;
|
const char * tokenEnd;
|
||||||
_mp_token_kind_t currentTokenKind = lex->tok_kind;
|
_mp_token_kind_t currentTokenKind = lex->tok_kind;
|
||||||
|
|
||||||
while (currentTokenKind != MP_TOKEN_NEWLINE && currentTokenKind != MP_TOKEN_END) {
|
while (currentTokenKind != MP_TOKEN_NEWLINE && currentTokenKind != MP_TOKEN_END && currentTokenKind != MP_TOKEN_FSTRING_RAW) {
|
||||||
tokenStart = firstNonSpace + lex->tok_column - 1;
|
tokenStart = firstNonSpace + lex->tok_column - 1;
|
||||||
tokenEnd = tokenStart + TokenLength(lex, tokenStart);
|
tokenEnd = tokenStart + TokenLength(lex, tokenStart);
|
||||||
|
|
||||||
@@ -249,7 +265,8 @@ void PythonTextArea::ContentView::drawLine(KDContext * ctx, int line, const char
|
|||||||
BackgroundColor,
|
BackgroundColor,
|
||||||
selectionStart,
|
selectionStart,
|
||||||
selectionEnd,
|
selectionEnd,
|
||||||
HighlightColor);
|
HighlightColor,
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
if (UTF8Helper::CodePointIs(firstNonSpace, UCodePointNull)) {
|
if (UTF8Helper::CodePointIs(firstNonSpace, UCodePointNull)) {
|
||||||
return;
|
return;
|
||||||
@@ -265,7 +282,7 @@ void PythonTextArea::ContentView::drawLine(KDContext * ctx, int line, const char
|
|||||||
const char * tokenFrom = firstNonSpace;
|
const char * tokenFrom = firstNonSpace;
|
||||||
size_t tokenLength = 0;
|
size_t tokenLength = 0;
|
||||||
const char * tokenEnd = firstNonSpace;
|
const char * tokenEnd = firstNonSpace;
|
||||||
while (lex->tok_kind != MP_TOKEN_NEWLINE && lex->tok_kind != MP_TOKEN_END) {
|
while (lex->tok_kind != MP_TOKEN_NEWLINE && lex->tok_kind != MP_TOKEN_END && lex->tok_kind != MP_TOKEN_FSTRING_RAW) {
|
||||||
tokenFrom = firstNonSpace + lex->tok_column - 1;
|
tokenFrom = firstNonSpace + lex->tok_column - 1;
|
||||||
if (tokenFrom != tokenEnd) {
|
if (tokenFrom != tokenEnd) {
|
||||||
// We passed over white spaces, we need to color them
|
// We passed over white spaces, we need to color them
|
||||||
@@ -279,13 +296,15 @@ void PythonTextArea::ContentView::drawLine(KDContext * ctx, int line, const char
|
|||||||
BackgroundColor,
|
BackgroundColor,
|
||||||
selectionStart,
|
selectionStart,
|
||||||
selectionEnd,
|
selectionEnd,
|
||||||
HighlightColor);
|
HighlightColor,
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
tokenLength = TokenLength(lex, tokenFrom);
|
tokenLength = TokenLength(lex, tokenFrom);
|
||||||
tokenEnd = tokenFrom + tokenLength;
|
tokenEnd = tokenFrom + tokenLength;
|
||||||
|
|
||||||
// If the token is being autocompleted, use DefaultColor
|
// If the token is being autocompleted, use DefaultColor/Font
|
||||||
KDColor color = (tokenFrom <= autocompleteStart && autocompleteStart < tokenEnd) ? Palette::CodeText : TokenColor(lex->tok_kind);
|
KDColor color = (tokenFrom <= autocompleteStart && autocompleteStart < tokenEnd) ? Palette::CodeText : TokenColor(lex->tok_kind);
|
||||||
|
bool italic = (tokenFrom <= autocompleteStart && autocompleteStart < tokenEnd) ? false : isItalic(lex->tok_kind);
|
||||||
|
|
||||||
LOG_DRAW("Draw \"%.*s\" for token %d\n", tokenLength, tokenFrom, lex->tok_kind);
|
LOG_DRAW("Draw \"%.*s\" for token %d\n", tokenLength, tokenFrom, lex->tok_kind);
|
||||||
drawStringAt(ctx, line,
|
drawStringAt(ctx, line,
|
||||||
@@ -296,7 +315,9 @@ void PythonTextArea::ContentView::drawLine(KDContext * ctx, int line, const char
|
|||||||
BackgroundColor,
|
BackgroundColor,
|
||||||
selectionStart,
|
selectionStart,
|
||||||
selectionEnd,
|
selectionEnd,
|
||||||
HighlightColor);
|
HighlightColor,
|
||||||
|
italic
|
||||||
|
);
|
||||||
|
|
||||||
mp_lexer_to_next(lex);
|
mp_lexer_to_next(lex);
|
||||||
LOG_DRAW("Pop token %d\n", lex->tok_kind);
|
LOG_DRAW("Pop token %d\n", lex->tok_kind);
|
||||||
@@ -304,6 +325,10 @@ void PythonTextArea::ContentView::drawLine(KDContext * ctx, int line, const char
|
|||||||
|
|
||||||
tokenFrom += tokenLength;
|
tokenFrom += tokenLength;
|
||||||
|
|
||||||
|
KDColor color = CommentColor;
|
||||||
|
if (!GlobalPreferences::sharedGlobalPreferences()->syntaxhighlighting()) {
|
||||||
|
color = Palette::CodeText;
|
||||||
|
}
|
||||||
// Even if the token is being autocompleted, use CommentColor
|
// Even if the token is being autocompleted, use CommentColor
|
||||||
if (tokenFrom < text + byteLength) {
|
if (tokenFrom < text + byteLength) {
|
||||||
LOG_DRAW("Draw comment \"%.*s\" from %d\n", byteLength - (tokenFrom - text), firstNonSpace, tokenFrom);
|
LOG_DRAW("Draw comment \"%.*s\" from %d\n", byteLength - (tokenFrom - text), firstNonSpace, tokenFrom);
|
||||||
@@ -311,11 +336,12 @@ void PythonTextArea::ContentView::drawLine(KDContext * ctx, int line, const char
|
|||||||
UTF8Helper::GlyphOffsetAtCodePoint(text, tokenFrom),
|
UTF8Helper::GlyphOffsetAtCodePoint(text, tokenFrom),
|
||||||
tokenFrom,
|
tokenFrom,
|
||||||
text + byteLength - tokenFrom,
|
text + byteLength - tokenFrom,
|
||||||
CommentColor,
|
color,
|
||||||
BackgroundColor,
|
BackgroundColor,
|
||||||
selectionStart,
|
selectionStart,
|
||||||
selectionEnd,
|
selectionEnd,
|
||||||
HighlightColor);
|
HighlightColor,
|
||||||
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_lexer_free(lex);
|
mp_lexer_free(lex);
|
||||||
@@ -335,7 +361,8 @@ void PythonTextArea::ContentView::drawLine(KDContext * ctx, int line, const char
|
|||||||
BackgroundColor,
|
BackgroundColor,
|
||||||
nullptr,
|
nullptr,
|
||||||
nullptr,
|
nullptr,
|
||||||
HighlightColor);
|
HighlightColor,
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -399,14 +426,14 @@ bool PythonTextArea::handleEvent(Ion::Events::Event event) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PythonTextArea::handleEventWithText(const char * text, bool indentation, bool forceCursorRightOfText) {
|
bool PythonTextArea::handleEventWithText(const char * text, bool indentation, bool forceCursorRightOfText, bool shouldRemoveLastCharacter) {
|
||||||
if (*text == 0) {
|
if (*text == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (m_contentView.isAutocompleting()) {
|
if (m_contentView.isAutocompleting()) {
|
||||||
removeAutocompletion();
|
removeAutocompletion();
|
||||||
}
|
}
|
||||||
bool result = TextArea::handleEventWithText(text, indentation, forceCursorRightOfText);
|
bool result = TextArea::handleEventWithText(text, indentation, forceCursorRightOfText, shouldRemoveLastCharacter);
|
||||||
addAutocompletion();
|
addAutocompletion();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -444,6 +471,11 @@ void PythonTextArea::addAutocompletion() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool PythonTextArea::addAutocompletionTextAtIndex(int nextIndex, int * currentIndexToUpdate) {
|
bool PythonTextArea::addAutocompletionTextAtIndex(int nextIndex, int * currentIndexToUpdate) {
|
||||||
|
// If Autocomplete disable, skip this step
|
||||||
|
if(!GlobalPreferences::sharedGlobalPreferences()->autocomplete()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// The variable box should be loaded at this point
|
// The variable box should be loaded at this point
|
||||||
const char * autocompletionTokenBeginning = nullptr;
|
const char * autocompletionTokenBeginning = nullptr;
|
||||||
const char * autocompletionLocation = const_cast<char *>(cursorLocation());
|
const char * autocompletionLocation = const_cast<char *>(cursorLocation());
|
||||||
@@ -461,9 +493,10 @@ bool PythonTextArea::addAutocompletionTextAtIndex(int nextIndex, int * currentIn
|
|||||||
|
|
||||||
if (textToInsertLength > 0) {
|
if (textToInsertLength > 0) {
|
||||||
// Try to insert the text (this might fail if the buffer is full)
|
// Try to insert the text (this might fail if the buffer is full)
|
||||||
if (!m_contentView.insertTextAtLocation(textToInsert, const_cast<char *>(autocompletionLocation), textToInsertLength)) {
|
if (!m_contentView.isAbleToInsertTextAt(textToInsertLength, autocompletionLocation, false)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
m_contentView.insertTextAtLocation(textToInsert, const_cast<char *>(autocompletionLocation), textToInsertLength);
|
||||||
autocompletionLocation += textToInsertLength;
|
autocompletionLocation += textToInsertLength;
|
||||||
m_contentView.setAutocompleting(true);
|
m_contentView.setAutocompleting(true);
|
||||||
m_contentView.setAutocompletionEnd(autocompletionLocation);
|
m_contentView.setAutocompletionEnd(autocompletionLocation);
|
||||||
@@ -475,7 +508,8 @@ bool PythonTextArea::addAutocompletionTextAtIndex(int nextIndex, int * currentIn
|
|||||||
assert(strlen(parentheses) == parenthesesLength);
|
assert(strlen(parentheses) == parenthesesLength);
|
||||||
/* If couldInsertText is false, we should not try to add the parentheses as
|
/* If couldInsertText is false, we should not try to add the parentheses as
|
||||||
* there was already not enough space to add the autocompletion. */
|
* there was already not enough space to add the autocompletion. */
|
||||||
if (addParentheses && m_contentView.insertTextAtLocation(parentheses, const_cast<char *>(autocompletionLocation), parenthesesLength)) {
|
if (addParentheses && m_contentView.isAbleToInsertTextAt(parenthesesLength, autocompletionLocation, false)) {
|
||||||
|
m_contentView.insertTextAtLocation(parentheses, const_cast<char *>(autocompletionLocation), parenthesesLength);
|
||||||
m_contentView.setAutocompleting(true);
|
m_contentView.setAutocompleting(true);
|
||||||
m_contentView.setAutocompletionEnd(autocompletionLocation + parenthesesLength);
|
m_contentView.setAutocompletionEnd(autocompletionLocation + parenthesesLength);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -23,14 +23,14 @@ public:
|
|||||||
void loadSyntaxHighlighter() { m_contentView.loadSyntaxHighlighter(); }
|
void loadSyntaxHighlighter() { m_contentView.loadSyntaxHighlighter(); }
|
||||||
void unloadSyntaxHighlighter() { m_contentView.unloadSyntaxHighlighter(); }
|
void unloadSyntaxHighlighter() { m_contentView.unloadSyntaxHighlighter(); }
|
||||||
bool handleEvent(Ion::Events::Event event) override;
|
bool handleEvent(Ion::Events::Event event) override;
|
||||||
bool handleEventWithText(const char * text, bool indentation = false, bool forceCursorRightOfText = false) override;
|
bool handleEventWithText(const char * text, bool indentation = false, bool forceCursorRightOfText = false, bool shouldRemoveLastCharacter = false) override;
|
||||||
/* autocompletionType returns:
|
/* autocompletionType returns:
|
||||||
* - EndOfIdentifier if there is currently autocompletion, or if the cursor is
|
* - EndOfIdentifier if there is currently autocompletion, or if the cursor is
|
||||||
* at the end of an identifier,
|
* at the end of an identifier,
|
||||||
* - MiddleOfIdentifier is the cursor is in the middle of an identifier,
|
* - MiddleOfIdentifier is the cursor is in the middle of an identifier,
|
||||||
* - No identifier otherwise.
|
* - No identifier otherwise.
|
||||||
* The autocompletionLocation can be provided with autocompletionLocation, or
|
* The autocompletionLocation can be provided with autocompletionLocation, or
|
||||||
* retreived with autocompletionLocationBeginning and autocompletionLocationEnd. */
|
* retrieved with autocompletionLocationBeginning and autocompletionLocationEnd. */
|
||||||
AutocompletionType autocompletionType(const char * autocompletionLocation = nullptr, const char ** autocompletionLocationBeginning = nullptr, const char ** autocompletionLocationEnd = nullptr) const;
|
AutocompletionType autocompletionType(const char * autocompletionLocation = nullptr, const char ** autocompletionLocationBeginning = nullptr, const char ** autocompletionLocationEnd = nullptr) const;
|
||||||
bool isAutocompleting() const { return m_contentView.isAutocompleting(); }
|
bool isAutocompleting() const { return m_contentView.isAutocompleting(); }
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -10,22 +10,22 @@ extern "C" {
|
|||||||
namespace Code {
|
namespace Code {
|
||||||
|
|
||||||
const ToolboxMessageTree forLoopChildren[] = {
|
const ToolboxMessageTree forLoopChildren[] = {
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::ForInRange1ArgLoopWithArg, I18n::Message::Default, false, I18n::Message::ForInRange1ArgLoop),
|
ToolboxMessageTree::Leaf(I18n::Message::ForInRange1ArgLoopWithArg, I18n::Message::Default, false, I18n::Message::ForInRange1ArgLoop, true, 2),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::ForInRange2ArgsLoopWithArg, I18n::Message::Default, false, I18n::Message::ForInRange2ArgsLoop),
|
ToolboxMessageTree::Leaf(I18n::Message::ForInRange2ArgsLoopWithArg, I18n::Message::Default, false, I18n::Message::ForInRange2ArgsLoop, true, 2),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::ForInRange3ArgsLoopWithArg, I18n::Message::Default, false, I18n::Message::ForInRange3ArgsLoop),
|
ToolboxMessageTree::Leaf(I18n::Message::ForInRange3ArgsLoopWithArg, I18n::Message::Default, false, I18n::Message::ForInRange3ArgsLoop, true, 2),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::ForInListLoopWithArg, I18n::Message::Default, false, I18n::Message::ForInListLoop)
|
ToolboxMessageTree::Leaf(I18n::Message::ForInListLoopWithArg, I18n::Message::Default, false, I18n::Message::ForInListLoop, true, 2)
|
||||||
};
|
};
|
||||||
|
|
||||||
const ToolboxMessageTree ifStatementChildren[] = {
|
const ToolboxMessageTree ifStatementChildren[] = {
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::IfElseStatementWithArg, I18n::Message::Default, false, I18n::Message::IfElseStatement),
|
ToolboxMessageTree::Leaf(I18n::Message::IfElseStatementWithArg, I18n::Message::Default, false, I18n::Message::IfElseStatement, true, 4),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::IfThenStatementWithArg, I18n::Message::Default, false, I18n::Message::IfThenStatement),
|
ToolboxMessageTree::Leaf(I18n::Message::IfThenStatementWithArg, I18n::Message::Default, false, I18n::Message::IfThenStatement, true, 2),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::IfElifElseStatementWithArg, I18n::Message::Default, false, I18n::Message::IfElifElseStatement),
|
ToolboxMessageTree::Leaf(I18n::Message::IfElifElseStatementWithArg, I18n::Message::Default, false, I18n::Message::IfElifElseStatement, true, 6),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::IfAndIfElseStatementWithArg, I18n::Message::Default, false, I18n::Message::IfAndIfElseStatement),
|
ToolboxMessageTree::Leaf(I18n::Message::IfAndIfElseStatementWithArg, I18n::Message::Default, false, I18n::Message::IfAndIfElseStatement, true, 4),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::IfOrIfElseStatementWithArg, I18n::Message::Default, false, I18n::Message::IfOrIfElseStatement)
|
ToolboxMessageTree::Leaf(I18n::Message::IfOrIfElseStatementWithArg, I18n::Message::Default, false, I18n::Message::IfOrIfElseStatement, true, 4)
|
||||||
};
|
};
|
||||||
|
|
||||||
const ToolboxMessageTree whileLoopChildren[] = {
|
const ToolboxMessageTree whileLoopChildren[] = {
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::WhileLoopWithArg, I18n::Message::Default, false, I18n::Message::WhileLoop)
|
ToolboxMessageTree::Leaf(I18n::Message::WhileLoopWithArg, I18n::Message::Default, false, I18n::Message::WhileLoop, true, 2)
|
||||||
};
|
};
|
||||||
|
|
||||||
const ToolboxMessageTree conditionsChildren[] = {
|
const ToolboxMessageTree conditionsChildren[] = {
|
||||||
@@ -75,6 +75,7 @@ const ToolboxMessageTree MathModuleChildren[] = {
|
|||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandAtan2, I18n::Message::PythonAtan2),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandAtan2, I18n::Message::PythonAtan2),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCeil, I18n::Message::PythonCeil),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCeil, I18n::Message::PythonCeil),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCopySign, I18n::Message::PythonCopySign),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCopySign, I18n::Message::PythonCopySign),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFactorial, I18n::Message::PythonFactorial),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFabs, I18n::Message::PythonFabs),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFabs, I18n::Message::PythonFabs),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFloor, I18n::Message::PythonFloor),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFloor, I18n::Message::PythonFloor),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFmod, I18n::Message::PythonFmod),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFmod, I18n::Message::PythonFmod),
|
||||||
@@ -135,6 +136,184 @@ const ToolboxMessageTree MatplotlibPyplotModuleChildren[] = {
|
|||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColorGray, I18n::Message::PythonColorGray, false)
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColorGray, I18n::Message::PythonColorGray, false)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(INCLUDE_ULAB)
|
||||||
|
|
||||||
|
const ToolboxMessageTree NumpyNdarrayModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyArray),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyArange),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyConcatenate),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyDiag),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyZeros),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyOnes),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyEmpty),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyEye),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFull),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyLinspace),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyLogspace),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFromBuffer),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyCopy, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyCopyWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyDtype, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyDtypeWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFlat, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyFlatWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFlatten, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyFlattenWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyShape, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyShapeWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyReshape, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyReshapeWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySize, I18n::Message::Default, false, I18n::Message::PythonCommandNumpySizeWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyTranspose, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyTransposeWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySort, I18n::Message::Default, false, I18n::Message::PythonCommandNumpySortWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyToBytes, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyToBytesWithoutArg)
|
||||||
|
};
|
||||||
|
|
||||||
|
const ToolboxMessageTree NumpyFunctionsModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyNdinfo),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAll),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAny),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyArgmax),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyArgmin),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyArgsort),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyClip),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyConvolve),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyDiff),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyInterp),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyDot),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyCross),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyEqual),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyNot_equal),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFlip),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyIsfinite),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyIsinf),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyMean),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyMin),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyMax),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyMedian),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyMinimum),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyMaximum),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyPolyfit),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyPolyval),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyRoll),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySortWithArguments),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyStd),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySum),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyTrace),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyTrapz),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyWhere),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyVectorize),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAcos),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAcosh),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyArctan2),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAround),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAsin),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAsinh),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAtan),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAtanh),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyCeil),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyCos),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyCosh),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyDegrees),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyExp),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyExpm1),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFloor),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyLog),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyLog10),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyLog2),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyRadians),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySin),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySinh),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySqrt),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyTan),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyTanh),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyBool),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFloat),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyUint8),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyInt8),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyUint16),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyInt16),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyNan),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyInf),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyE),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyPi),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySetPrintOptions),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyGetPrintOptions)
|
||||||
|
};
|
||||||
|
|
||||||
|
const ToolboxMessageTree NumpyFftModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFftFunction, I18n::Message::PythonNumpyFftFunction, false, I18n::Message::PythonCommandNumpyFftFunctionWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFft),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyIfft)
|
||||||
|
};
|
||||||
|
|
||||||
|
const ToolboxMessageTree NumpyLinalgModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyLinalgFunction, I18n::Message::PythonNumpyLinalgFunction, false, I18n::Message::PythonCommandNumpyLinalgFunctionWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyDet),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyEig),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyCholesky),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyInv),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyNorm)
|
||||||
|
};
|
||||||
|
|
||||||
|
const ToolboxMessageTree NumpyModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromNumpy, I18n::Message::PythonImportNumpy, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFunction, I18n::Message::PythonNumpyFunction, false, I18n::Message::PythonCommandNumpyFunctionWithoutArg),
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::NumpyNdarray, NumpyNdarrayModuleChildren),
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::Functions, NumpyFunctionsModuleChildren),
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::NumpyFftModule, NumpyFftModuleChildren),
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::NumpyLinalgModule, NumpyLinalgModuleChildren)
|
||||||
|
};
|
||||||
|
|
||||||
|
const ToolboxMessageTree ScipyLinalgModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyLinalgFunction, I18n::Message::PythonScipyLinalgFunction, false, I18n::Message::PythonCommandScipyLinalgFunctionWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyLinalgChoSolve),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyLinalgSolveTriangular)
|
||||||
|
};
|
||||||
|
|
||||||
|
const ToolboxMessageTree ScipyOptimizeModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyOptimizeFunction, I18n::Message::PythonScipyOptimizeFunction, false, I18n::Message::PythonCommandScipyOptimizeFunctionWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyOptimizeBisect),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyOptimizeFmin),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyOptimizeNewton)
|
||||||
|
};
|
||||||
|
|
||||||
|
const ToolboxMessageTree ScipySignalModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySignalFunction, I18n::Message::PythonScipySignalFunction, false, I18n::Message::PythonCommandScipySignalFunctionWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySignalSosfilt),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySignalSpectrogram)
|
||||||
|
};
|
||||||
|
|
||||||
|
const ToolboxMessageTree ScipySpecialModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySpecialFunction, I18n::Message::PythonScipySpecialFunction, false, I18n::Message::PythonCommandScipySpecialFunctionWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySpecialErf),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySpecialErfc),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySpecialGamma),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySpecialGammaln),
|
||||||
|
};
|
||||||
|
|
||||||
|
const ToolboxMessageTree ScipyModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromScipy, I18n::Message::PythonImportScipy, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyFunction, I18n::Message::PythonScipyFunction, false, I18n::Message::PythonCommandScipyFunctionWithoutArg),
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::ScipyLinalgModule, ScipyLinalgModuleChildren),
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::ScipyOptimizeModule, ScipyOptimizeModuleChildren),
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::ScipySignalModule, ScipySignalModuleChildren),
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::ScipySpecialModule, ScipySpecialModuleChildren),
|
||||||
|
};
|
||||||
|
|
||||||
|
const ToolboxMessageTree UtilsModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromUtils, I18n::Message::PythonImportUtils, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandUtilsFunction, I18n::Message::PythonUtilsFunction, false, I18n::Message::PythonCommandUtilsFunctionWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandUtilsSpectrogram),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandUtilsFromInt16Buffer),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandUtilsFromUint16Buffer),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandUtilsFromInt32Buffer),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandUtilsFromUint32Buffer),
|
||||||
|
};
|
||||||
|
|
||||||
|
const ToolboxMessageTree UlabModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::NumpyModule, NumpyModuleChildren),
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::ScipyModule, ScipyModuleChildren),
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::UtilsModule, UtilsModuleChildren),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::UlabDocumentation, I18n::Message::UlabDocumentationLink)
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
const ToolboxMessageTree TurtleModuleChildren[] = {
|
const ToolboxMessageTree TurtleModuleChildren[] = {
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportTurtle, I18n::Message::PythonImportTurtle, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportTurtle, I18n::Message::PythonImportTurtle, false),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromTurtle, I18n::Message::PythonImportTurtle, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromTurtle, I18n::Message::PythonImportTurtle, false),
|
||||||
@@ -159,6 +338,7 @@ const ToolboxMessageTree TurtleModuleChildren[] = {
|
|||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandHideturtle, I18n::Message::PythonTurtleHideturtle, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandHideturtle, I18n::Message::PythonTurtleHideturtle, false),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandColor, I18n::Message::PythonTurtleColor),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandColor, I18n::Message::PythonTurtleColor),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandColorMode, I18n::Message::PythonTurtleColorMode),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandColorMode, I18n::Message::PythonTurtleColorMode),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandBgcolor, I18n::Message::PythonTurtleBgcolor),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColorBlue, I18n::Message::PythonColorBlue, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColorBlue, I18n::Message::PythonColorBlue, false),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColorRed, I18n::Message::PythonColorRed, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColorRed, I18n::Message::PythonColorRed, false),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColorGreen, I18n::Message::PythonColorGreen, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColorGreen, I18n::Message::PythonColorGreen, false),
|
||||||
@@ -194,7 +374,60 @@ const ToolboxMessageTree KandinskyModuleChildren[] = {
|
|||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColor, I18n::Message::PythonColor),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColor, I18n::Message::PythonColor),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawString, I18n::Message::PythonDrawString),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawString, I18n::Message::PythonDrawString),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawLine, I18n::Message::PythonDrawLine),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawLine, I18n::Message::PythonDrawLine),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillRect, I18n::Message::PythonFillRect)
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawCircle, I18n::Message::PythonDrawCircle),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillRect, I18n::Message::PythonFillRect),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillCircle, I18n::Message::PythonFillCircle),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillPolygon, I18n::Message::PythonFillPolygon),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandGetPalette, I18n::Message::PythonGetPalette)
|
||||||
|
};
|
||||||
|
|
||||||
|
const ToolboxMessageTree IonKeyModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyLeft, I18n::Message::PythonKeyLeft, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyUp, I18n::Message::PythonKeyUp, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyDown, I18n::Message::PythonKeyDown, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyRight, I18n::Message::PythonKeyRight, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyOk, I18n::Message::PythonKeyOk, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyBack, I18n::Message::PythonKeyBack, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyHome, I18n::Message::PythonKeyHome, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyOnOff, I18n::Message::PythonKeyOnOff, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyShift, I18n::Message::PythonKeyShift, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyAlpha, I18n::Message::PythonKeyAlpha, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyXnt, I18n::Message::PythonKeyXnt, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyVar, I18n::Message::PythonKeyVar, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyToolbox, I18n::Message::PythonKeyToolbox, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyBackspace, I18n::Message::PythonKeyBackspace, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyExp, I18n::Message::PythonKeyExp, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyLn, I18n::Message::PythonKeyLn, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyLog, I18n::Message::PythonKeyLog, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyImaginary, I18n::Message::PythonKeyImaginary, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyComma, I18n::Message::PythonKeyComma, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyPower, I18n::Message::PythonKeyPower, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySine, I18n::Message::PythonKeySine, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyCosine, I18n::Message::PythonKeyCosine, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyTangent, I18n::Message::PythonKeyTangent, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyPi, I18n::Message::PythonKeyPi, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySqrt, I18n::Message::PythonKeySqrt, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySquare, I18n::Message::PythonKeySquare, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySeven, I18n::Message::PythonKeySeven, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyEight, I18n::Message::PythonKeyEight, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyNine, I18n::Message::PythonKeyNine, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyLeftParenthesis, I18n::Message::PythonKeyLeftParenthesis, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyRightParenthesis, I18n::Message::PythonKeyRightParenthesis, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyFour, I18n::Message::PythonKeyFour, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyFive, I18n::Message::PythonKeyFive, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySix, I18n::Message::PythonKeySix, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyMultiplication, I18n::Message::PythonKeyMultiplication, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyDivision, I18n::Message::PythonKeyDivision, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyOne, I18n::Message::PythonKeyOne, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyTwo, I18n::Message::PythonKeyTwo, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyThree, I18n::Message::PythonKeyThree, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyPlus, I18n::Message::PythonKeyPlus, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyMinus, I18n::Message::PythonKeyMinus, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyZero, I18n::Message::PythonKeyZero, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyDot, I18n::Message::PythonKeyDot, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyEe, I18n::Message::PythonKeyEe, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyAns, I18n::Message::PythonKeyAns, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyExe, I18n::Message::PythonKeyExe, false)
|
||||||
};
|
};
|
||||||
|
|
||||||
const ToolboxMessageTree IonModuleChildren[] = {
|
const ToolboxMessageTree IonModuleChildren[] = {
|
||||||
@@ -202,40 +435,84 @@ const ToolboxMessageTree IonModuleChildren[] = {
|
|||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromIon, I18n::Message::PythonImportIon, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromIon, I18n::Message::PythonImportIon, false),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIonFunction, I18n::Message::PythonIonFunction, false, I18n::Message::PythonCommandIonFunctionWithoutArg),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIonFunction, I18n::Message::PythonIonFunction, false, I18n::Message::PythonCommandIonFunctionWithoutArg),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIsKeyDown, I18n::Message::PythonIsKeyDown),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIsKeyDown, I18n::Message::PythonIsKeyDown),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::IonSelector, I18n::Message::IonSelector)
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandGetKeys, I18n::Message::PythonGetKeys),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandBattery, I18n::Message::PythonBattery),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandBatteryLevel, I18n::Message::PythonBatteryLevel),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandBatteryIscharging, I18n::Message::PythonBatteryIscharging),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandSetBrightness, I18n::Message::PythonSetBrightness),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandGetBrightness, I18n::Message::PythonGetBrightness),
|
||||||
|
// This is a special case, because it is handled separately, so the sub-tree is unused.
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::IonSelector, IonKeyModuleChildren),
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::IonKeyList, IonKeyModuleChildren)
|
||||||
};
|
};
|
||||||
|
|
||||||
const ToolboxMessageTree TimeModuleChildren[] = {
|
const ToolboxMessageTree TimeModuleChildren[] = {
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportTime, I18n::Message::PythonImportTime, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportTime, I18n::Message::PythonImportTime, false),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromTime, I18n::Message::PythonImportTime, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromTime, I18n::Message::PythonImportTime, false),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandTimeFunction, I18n::Message::PythonTimeFunction, false, I18n::Message::PythonCommandTimeFunctionWithoutArg),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandTimeFunction, I18n::Message::PythonTimeFunction, false, I18n::Message::PythonCommandTimeFunctionWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandTime, I18n::Message::PythonTime),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandMonotonic, I18n::Message::PythonMonotonic, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandMonotonic, I18n::Message::PythonMonotonic, false),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandSleep, I18n::Message::PythonSleep)
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandSleep, I18n::Message::PythonSleep),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandLocalTime, I18n::Message::PythonLocalTime),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandMktime, I18n::Message::PythonMktime),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandSetLocaltime, I18n::Message::PythonSetLocaltime),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandRTCmode, I18n::Message::PythonRTCmode),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandSetRTCmode, I18n::Message::PythonSetRTCmode),
|
||||||
};
|
};
|
||||||
|
|
||||||
const ToolboxMessageTree OsModuleChildren[] = {
|
const ToolboxMessageTree OsModuleChildren[] = {
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportOs, I18n::Message::PythonImportOs, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportOs, I18n::Message::PythonImportOs, false),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromOs, I18n::Message::PythonImportOs, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromOs, I18n::Message::PythonImportOs, false),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandUname, I18n::Message::PythonOsUname, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandUname, I18n::Message::PythonOsUname, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandGetlogin, I18n::Message::PythonOsGetlogin, false),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandRemove, I18n::Message::PythonOsRemove, false, I18n::Message::PythonOsCommandRemoveWithoutArg),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandRemove, I18n::Message::PythonOsRemove, false, I18n::Message::PythonOsCommandRemoveWithoutArg),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandRename, I18n::Message::PythonOsRename, false, I18n::Message::PythonOsCommandRenameWithoutArg),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandRename, I18n::Message::PythonOsRename, false, I18n::Message::PythonOsCommandRenameWithoutArg),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandListdir, I18n::Message::PythonOsListdir, false)
|
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandListdir, I18n::Message::PythonOsListdir, false)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if MICROPY_PY_SYS
|
||||||
|
const ToolboxMessageTree SysModuleChildren[] = {
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportSys, I18n::Message::PythonImportSys, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromSys, I18n::Message::PythonImportSys, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandExit, I18n::Message::PythonSysExit, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandPrintexception, I18n::Message::PythonSysPrintexception, false, I18n::Message::PythonSysCommandPrintexceptionWithoutArg),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandByteorder, I18n::Message::PythonSysByteorder, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandImplementation, I18n::Message::PythonSysImplementation, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandModules, I18n::Message::PythonSysModules, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandVersion, I18n::Message::PythonSysVersion, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandVersioninfo, I18n::Message::PythonSysVersioninfo, false)
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
const ToolboxMessageTree modulesChildren[] = {
|
const ToolboxMessageTree modulesChildren[] = {
|
||||||
ToolboxMessageTree::Node(I18n::Message::MathModule, MathModuleChildren),
|
ToolboxMessageTree::Node(I18n::Message::MathModule, MathModuleChildren),
|
||||||
ToolboxMessageTree::Node(I18n::Message::CmathModule, CMathModuleChildren),
|
ToolboxMessageTree::Node(I18n::Message::CmathModule, CMathModuleChildren),
|
||||||
ToolboxMessageTree::Node(I18n::Message::MatplotlibPyplotModule, MatplotlibPyplotModuleChildren),
|
ToolboxMessageTree::Node(I18n::Message::MatplotlibPyplotModule, MatplotlibPyplotModuleChildren),
|
||||||
|
#if defined(INCLUDE_ULAB)
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::UlabModule, UlabModuleChildren),
|
||||||
|
#endif
|
||||||
ToolboxMessageTree::Node(I18n::Message::TurtleModule, TurtleModuleChildren),
|
ToolboxMessageTree::Node(I18n::Message::TurtleModule, TurtleModuleChildren),
|
||||||
ToolboxMessageTree::Node(I18n::Message::RandomModule, RandomModuleChildren),
|
ToolboxMessageTree::Node(I18n::Message::RandomModule, RandomModuleChildren),
|
||||||
ToolboxMessageTree::Node(I18n::Message::KandinskyModule, KandinskyModuleChildren),
|
ToolboxMessageTree::Node(I18n::Message::KandinskyModule, KandinskyModuleChildren),
|
||||||
ToolboxMessageTree::Node(I18n::Message::IonModule, IonModuleChildren),
|
ToolboxMessageTree::Node(I18n::Message::IonModule, IonModuleChildren),
|
||||||
ToolboxMessageTree::Node(I18n::Message::OsModule, OsModuleChildren),
|
ToolboxMessageTree::Node(I18n::Message::OsModule, OsModuleChildren),
|
||||||
|
#if MICROPY_PY_SYS
|
||||||
|
ToolboxMessageTree::Node(I18n::Message::SysModule, SysModuleChildren),
|
||||||
|
#endif
|
||||||
ToolboxMessageTree::Node(I18n::Message::TimeModule, TimeModuleChildren)
|
ToolboxMessageTree::Node(I18n::Message::TimeModule, TimeModuleChildren)
|
||||||
};
|
};
|
||||||
|
|
||||||
const ToolboxMessageTree catalogChildren[] = {
|
const ToolboxMessageTree catalogChildren[] = {
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandPound, I18n::Message::PythonPound, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandPound, I18n::Message::PythonPound, false),
|
||||||
|
#ifdef _FXCG
|
||||||
|
// There is no question mark button on the fx-CG calculators
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColon, I18n::Message::PythonColon, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandSemicon, I18n::Message::PythonSemicon, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandExclamationMark, I18n::Message::PythonExclamationMark, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandLessThan, I18n::Message::PythonLessThan, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandGreaterThan, I18n::Message::PythonGreaterThan, false),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandQuestionMark, I18n::Message::PythonQuestionMark, false),
|
||||||
|
#endif
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandPercent, I18n::Message::PythonPercent, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandPercent, I18n::Message::PythonPercent, false),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommand1J, I18n::Message::Python1J, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommand1J, I18n::Message::Python1J, false),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandLF, I18n::Message::PythonLF, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandLF, I18n::Message::PythonLF, false),
|
||||||
@@ -266,12 +543,14 @@ const ToolboxMessageTree catalogChildren[] = {
|
|||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCmathFunction, I18n::Message::PythonCmathFunction, false, I18n::Message::PythonCommandCmathFunctionWithoutArg),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCmathFunction, I18n::Message::PythonCmathFunction, false, I18n::Message::PythonCommandCmathFunctionWithoutArg),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColor, I18n::Message::PythonColor),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColor, I18n::Message::PythonColor),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandColorMode, I18n::Message::PythonTurtleColorMode),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandColorMode, I18n::Message::PythonTurtleColorMode),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandBgcolor, I18n::Message::PythonTurtleBgcolor),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandComplex, I18n::Message::PythonComplex),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandComplex, I18n::Message::PythonComplex),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCopySign, I18n::Message::PythonCopySign),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCopySign, I18n::Message::PythonCopySign),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCos, I18n::Message::PythonCos),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCos, I18n::Message::PythonCos),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCosh, I18n::Message::PythonCosh),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCosh, I18n::Message::PythonCosh),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDegrees, I18n::Message::PythonDegrees),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDegrees, I18n::Message::PythonDegrees),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDivMod, I18n::Message::PythonDivMod),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDivMod, I18n::Message::PythonDivMod),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawCircle, I18n::Message::PythonDrawCircle),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawLine, I18n::Message::PythonDrawLine),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawLine, I18n::Message::PythonDrawLine),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawString, I18n::Message::PythonDrawString),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawString, I18n::Message::PythonDrawString),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandConstantE, I18n::Message::PythonConstantE, false),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandConstantE, I18n::Message::PythonConstantE, false),
|
||||||
@@ -281,6 +560,8 @@ const ToolboxMessageTree catalogChildren[] = {
|
|||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandExp, I18n::Message::PythonExp),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandExp, I18n::Message::PythonExp),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandExpm1, I18n::Message::PythonExpm1),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandExpm1, I18n::Message::PythonExpm1),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFabs, I18n::Message::PythonFabs),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFabs, I18n::Message::PythonFabs),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillCircle, I18n::Message::PythonFillCircle),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillPolygon, I18n::Message::PythonFillPolygon),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillRect, I18n::Message::PythonFillRect),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillRect, I18n::Message::PythonFillRect),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFloat, I18n::Message::PythonFloat),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFloat, I18n::Message::PythonFloat),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFloor, I18n::Message::PythonFloor),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFloor, I18n::Message::PythonFloor),
|
||||||
@@ -323,6 +604,7 @@ const ToolboxMessageTree catalogChildren[] = {
|
|||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIsNaN, I18n::Message::PythonIsNaN),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIsNaN, I18n::Message::PythonIsNaN),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKandinskyFunction, I18n::Message::PythonKandinskyFunction, false, I18n::Message::PythonCommandKandinskyFunctionWithoutArg),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKandinskyFunction, I18n::Message::PythonKandinskyFunction, false, I18n::Message::PythonCommandKandinskyFunctionWithoutArg),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIsKeyDown, I18n::Message::PythonIsKeyDown),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIsKeyDown, I18n::Message::PythonIsKeyDown),
|
||||||
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandBattery, I18n::Message::PythonBattery),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandLdexp, I18n::Message::PythonLdexp),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandLdexp, I18n::Message::PythonLdexp),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandLeft, I18n::Message::PythonTurtleLeft),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandLeft, I18n::Message::PythonTurtleLeft),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandLength, I18n::Message::PythonLength),
|
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandLength, I18n::Message::PythonLength),
|
||||||
@@ -423,10 +705,10 @@ const ToolboxMessageTree fileChildren[] {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const ToolboxMessageTree exceptionsChildren[] = {
|
const ToolboxMessageTree exceptionsChildren[] = {
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::TryExcept1ErrorWithArg, I18n::Message::Default, false, I18n::Message::TryExcept1Error),
|
ToolboxMessageTree::Leaf(I18n::Message::TryExcept1ErrorWithArg, I18n::Message::Default, false, I18n::Message::TryExcept1Error, true, 4),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::TryExcept1ErrorElseWithArg, I18n::Message::Default, false, I18n::Message::TryExcept1ErrorElse),
|
ToolboxMessageTree::Leaf(I18n::Message::TryExcept1ErrorElseWithArg, I18n::Message::Default, false, I18n::Message::TryExcept1ErrorElse, true, 6),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::TryExcept2ErrorWithArg, I18n::Message::Default, false, I18n::Message::TryExcept2Error),
|
ToolboxMessageTree::Leaf(I18n::Message::TryExcept2ErrorWithArg, I18n::Message::Default, false, I18n::Message::TryExcept2Error, true, 4),
|
||||||
ToolboxMessageTree::Leaf(I18n::Message::WithInstructionWithArg, I18n::Message::Default, false, I18n::Message::WithInstruction),
|
ToolboxMessageTree::Leaf(I18n::Message::WithInstructionWithArg, I18n::Message::Default, false, I18n::Message::WithInstruction, true, 2),
|
||||||
};
|
};
|
||||||
|
|
||||||
const ToolboxMessageTree menu[] = {
|
const ToolboxMessageTree menu[] = {
|
||||||
@@ -444,6 +726,10 @@ const ToolboxMessageTree toolboxModel = ToolboxMessageTree::Node(I18n::Message::
|
|||||||
PythonToolbox::PythonToolbox() :
|
PythonToolbox::PythonToolbox() :
|
||||||
Toolbox(nullptr, rootModel()->label())
|
Toolbox(nullptr, rootModel()->label())
|
||||||
{
|
{
|
||||||
|
for (int i=0; i < k_maxNumberOfDisplayedRows; i++) {
|
||||||
|
m_leafCells[i].setMessageFont(KDFont::LargeFont);
|
||||||
|
m_nodeCells[i].setMessageFont(KDFont::LargeFont);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const ToolboxMessageTree * PythonToolbox::moduleChildren(const char * name, int * numberOfNodes) const {
|
const ToolboxMessageTree * PythonToolbox::moduleChildren(const char * name, int * numberOfNodes) const {
|
||||||
@@ -474,31 +760,28 @@ bool PythonToolbox::handleEvent(Ion::Events::Event event) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PythonToolbox::willDisplayCellForIndex(HighlightCell * cell, int index) {
|
||||||
|
Toolbox::willDisplayCellForIndex(cell, index);
|
||||||
|
const ToolboxMessageTree * messageTree = static_cast<const ToolboxMessageTree *>(m_messageTreeModel->childAtIndex(index));
|
||||||
|
MessageTableCell<SlideableMessageTextView> * myCell = static_cast<MessageTableCell<SlideableMessageTextView> *>(cell);
|
||||||
|
myCell->setMessageFont(messageTree->isMultiLine() ? KDFont::SmallFont : KDFont::LargeFont);
|
||||||
|
}
|
||||||
|
|
||||||
KDCoordinate PythonToolbox::rowHeight(int j) {
|
KDCoordinate PythonToolbox::rowHeight(int j) {
|
||||||
if (typeAtLocation(0, j) == Toolbox::LeafCellType && (m_messageTreeModel->label() == I18n::Message::IfStatementMenu || m_messageTreeModel->label() == I18n::Message::Exceptions)) {
|
const ToolboxMessageTree * messageTree = static_cast<const ToolboxMessageTree *>(m_messageTreeModel->childAtIndex(j));
|
||||||
/* To get the exact height needed for each cell, we have to compute its
|
if (messageTree->isMultiLine()) {
|
||||||
* text size, which means scan the text char by char to look for '\n'
|
return k_fontForMultiLine->glyphSize().height() * messageTree->numberOfLines() + 2*Metric::TableCellVerticalMargin + (messageTree->text() == I18n::Message::Default ? 0 : Toolbox::rowHeight(j));
|
||||||
* chars. This is very costly and ruins the speed performance when
|
|
||||||
* scrolling at the bottom of a long table: to compute a position on the
|
|
||||||
* kth row, we call cumulatedHeightFromIndex(k), which calls rowHeight k
|
|
||||||
* times.
|
|
||||||
* We thus decided to compute the real height only for the ifStatement
|
|
||||||
* children of the toolbox, which is the only menu that has special height
|
|
||||||
* rows. */
|
|
||||||
const ToolboxMessageTree * messageTree = static_cast<const ToolboxMessageTree *>(m_messageTreeModel->childAtIndex(j));
|
|
||||||
return k_font->stringSize(I18n::translate(messageTree->label())).height() + 2*Metric::TableCellVerticalMargin + (messageTree->text() == I18n::Message::Default ? 0 : Toolbox::rowHeight(j));
|
|
||||||
}
|
}
|
||||||
return Toolbox::rowHeight(j);
|
return Toolbox::rowHeight(j);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PythonToolbox::selectLeaf(int selectedRow) {
|
bool PythonToolbox::selectLeaf(int selectedRow, bool quitToolbox) {
|
||||||
m_selectableTableView.deselectTable();
|
|
||||||
ToolboxMessageTree * node = (ToolboxMessageTree *)m_messageTreeModel->childAtIndex(selectedRow);
|
ToolboxMessageTree * node = (ToolboxMessageTree *)m_messageTreeModel->childAtIndex(selectedRow);
|
||||||
if(node->insertedText() == I18n::Message::IonSelector){
|
#if defined(INCLUDE_ULAB)
|
||||||
App::app()->toolboxIonKeys()->setSender(sender());
|
if(node->text() == I18n::Message::UlabDocumentationLink){
|
||||||
Container::activeApp()->displayModalViewController(static_cast<ViewController*>(App::app()->toolboxIonKeys()), 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
const char * editedText = I18n::translate(node->insertedText());
|
const char * editedText = I18n::translate(node->insertedText());
|
||||||
// strippedEditedText array needs to be in the same scope as editedText
|
// strippedEditedText array needs to be in the same scope as editedText
|
||||||
char strippedEditedText[k_maxMessageSize];
|
char strippedEditedText[k_maxMessageSize];
|
||||||
@@ -509,20 +792,35 @@ bool PythonToolbox::selectLeaf(int selectedRow) {
|
|||||||
editedText = strippedEditedText;
|
editedText = strippedEditedText;
|
||||||
}
|
}
|
||||||
sender()->handleEventWithText(editedText, true);
|
sender()->handleEventWithText(editedText, true);
|
||||||
Container::activeApp()->dismissModalViewController();
|
if (quitToolbox) {
|
||||||
|
m_selectableTableView.deselectTable();
|
||||||
|
Container::activeApp()->dismissModalViewController();
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is the same function as in the Toolbox class, but we need to override it because we need to handle the Key selector differently.
|
||||||
|
bool PythonToolbox::selectSubMenu(int selectedRow) {
|
||||||
|
// If the selected row is a is the Key selector, we display the IonKeySelectorViewController
|
||||||
|
if (m_messageTreeModel->childAtIndex(selectedRow)->label() == I18n::Message::IonSelector) {
|
||||||
|
m_ionKeys.setSender(sender());
|
||||||
|
Container::activeApp()->displayModalViewController(static_cast<ViewController*>(&m_ionKeys), 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return Toolbox::selectSubMenu(selectedRow);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const ToolboxMessageTree * PythonToolbox::rootModel() const {
|
const ToolboxMessageTree * PythonToolbox::rootModel() const {
|
||||||
return &toolboxModel;
|
return &toolboxModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageTableCellWithMessage * PythonToolbox::leafCellAtIndex(int index) {
|
MessageTableCellWithMessage<SlideableMessageTextView> * PythonToolbox::leafCellAtIndex(int index) {
|
||||||
assert(index >= 0 && index < k_maxNumberOfDisplayedRows);
|
assert(index >= 0 && index < k_maxNumberOfDisplayedRows);
|
||||||
return &m_leafCells[index];
|
return &m_leafCells[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageTableCellWithChevron* PythonToolbox::nodeCellAtIndex(int index) {
|
MessageTableCellWithChevron<SlideableMessageTextView> * PythonToolbox::nodeCellAtIndex(int index) {
|
||||||
assert(index >= 0 && index < k_maxNumberOfDisplayedRows);
|
assert(index >= 0 && index < k_maxNumberOfDisplayedRows);
|
||||||
return &m_nodeCells[index];
|
return &m_nodeCells[index];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include <escher.h>
|
#include <escher.h>
|
||||||
#include <ion/events.h>
|
#include <ion/events.h>
|
||||||
#include <kandinsky/font.h>
|
#include <kandinsky/font.h>
|
||||||
|
#include "toolbox_ion_keys.h"
|
||||||
|
|
||||||
namespace Code {
|
namespace Code {
|
||||||
|
|
||||||
@@ -17,21 +18,28 @@ public:
|
|||||||
// Toolbox
|
// Toolbox
|
||||||
bool handleEvent(Ion::Events::Event event) override;
|
bool handleEvent(Ion::Events::Event event) override;
|
||||||
const ToolboxMessageTree * rootModel() const override;
|
const ToolboxMessageTree * rootModel() const override;
|
||||||
|
|
||||||
|
// ListViewDataSource
|
||||||
|
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
KDCoordinate rowHeight(int j) override;
|
KDCoordinate rowHeight(int j) override;
|
||||||
bool selectLeaf(int selectedRow) override;
|
bool selectLeaf(int selectedRow, bool quitToolbox) override;
|
||||||
MessageTableCellWithMessage * leafCellAtIndex(int index) override;
|
bool selectSubMenu(int selectedRow) override;
|
||||||
MessageTableCellWithChevron* nodeCellAtIndex(int index) override;
|
MessageTableCellWithMessage<SlideableMessageTextView> * leafCellAtIndex(int index) override;
|
||||||
|
MessageTableCellWithChevron<SlideableMessageTextView> * nodeCellAtIndex(int index) override;
|
||||||
int maxNumberOfDisplayedRows() override;
|
int maxNumberOfDisplayedRows() override;
|
||||||
|
bool canStayInMenu() override { return true; }
|
||||||
constexpr static int k_maxNumberOfDisplayedRows = 13; // = 240/(13+2*3)
|
constexpr static int k_maxNumberOfDisplayedRows = 13; // = 240/(13+2*3)
|
||||||
// 13 = minimal string height size
|
// 13 = minimal string height size
|
||||||
// 3 = vertical margins
|
// 3 = vertical margins
|
||||||
private:
|
private:
|
||||||
constexpr static const KDFont * k_font = KDFont::SmallFont;
|
constexpr static const KDFont * k_fontForMultiLine = KDFont::SmallFont;
|
||||||
void scrollToLetter(char letter);
|
void scrollToLetter(char letter);
|
||||||
void scrollToAndSelectChild(int i);
|
void scrollToAndSelectChild(int i);
|
||||||
MessageTableCellWithMessage m_leafCells[k_maxNumberOfDisplayedRows];
|
MessageTableCellWithMessage<SlideableMessageTextView> m_leafCells[k_maxNumberOfDisplayedRows];
|
||||||
MessageTableCellWithChevron m_nodeCells[k_maxNumberOfDisplayedRows];
|
MessageTableCellWithChevron<SlideableMessageTextView> m_nodeCells[k_maxNumberOfDisplayedRows];
|
||||||
|
ToolboxIonKeys m_ionKeys;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ void ScriptNodeCell::ScriptNodeView::drawRect(KDContext * ctx, KDRect rect) cons
|
|||||||
const int nodeNameLength = m_scriptNode->nameLength();
|
const int nodeNameLength = m_scriptNode->nameLength();
|
||||||
KDSize nameSize = k_font->stringSize(nodeName, nodeNameLength);
|
KDSize nameSize = k_font->stringSize(nodeName, nodeNameLength);
|
||||||
const KDCoordinate nodeNameY = k_topMargin;
|
const KDCoordinate nodeNameY = k_topMargin;
|
||||||
ctx->drawString(nodeName, KDPoint(0, nodeNameY), k_font, KDColorBlack, backgroundColor, nodeNameLength);
|
ctx->drawString(nodeName, KDPoint(0, nodeNameY), k_font, Palette::PrimaryText, backgroundColor, nodeNameLength);
|
||||||
// If it is needed, draw the parentheses
|
// If it is needed, draw the parentheses
|
||||||
if (m_scriptNode->type() == ScriptNode::Type::WithParentheses) {
|
if (m_scriptNode->type() == ScriptNode::Type::WithParentheses) {
|
||||||
ctx->drawString(ScriptNodeCell::k_parentheses, KDPoint(nameSize.width(), nodeNameY), k_font, KDColorBlack, backgroundColor);
|
ctx->drawString(ScriptNodeCell::k_parentheses, KDPoint(nameSize.width(), nodeNameY), k_font, Palette::PrimaryText, backgroundColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If it exists, draw the source name. If it did not fit, we would have put
|
/* If it exists, draw the source name. If it did not fit, we would have put
|
||||||
|
|||||||
@@ -34,11 +34,11 @@ private:
|
|||||||
constexpr static int k_totalNumberOfCell = 6;
|
constexpr static int k_totalNumberOfCell = 6;
|
||||||
StackViewController * stackViewController();
|
StackViewController * stackViewController();
|
||||||
I18n::Message m_pageTitle;
|
I18n::Message m_pageTitle;
|
||||||
MessageTableCell m_executeScript;
|
MessageTableCell<> m_executeScript;
|
||||||
MessageTableCell m_renameScript;
|
MessageTableCell<> m_renameScript;
|
||||||
MessageTableCellWithSwitch m_autoImportScript;
|
MessageTableCellWithSwitch m_autoImportScript;
|
||||||
MessageTableCell m_deleteScript;
|
MessageTableCell<> m_deleteScript;
|
||||||
MessageTableCell m_duplicateScript;
|
MessageTableCell<> m_duplicateScript;
|
||||||
MessageTableCellWithBuffer m_size;
|
MessageTableCellWithBuffer m_size;
|
||||||
void GetScriptSize(MessageTableCellWithBuffer* myCell);
|
void GetScriptSize(MessageTableCellWithBuffer* myCell);
|
||||||
SelectableTableView m_selectableTableView;
|
SelectableTableView m_selectableTableView;
|
||||||
|
|||||||
@@ -8,11 +8,9 @@ bool ScriptStore::ScriptNameIsFree(const char * baseName) {
|
|||||||
return ScriptBaseNamed(baseName).isNull();
|
return ScriptBaseNamed(baseName).isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Here we add "base" script
|
||||||
ScriptStore::ScriptStore() {
|
ScriptStore::ScriptStore() {
|
||||||
addScriptFromTemplate(ScriptTemplate::Squares());
|
|
||||||
addScriptFromTemplate(ScriptTemplate::Parabola());
|
|
||||||
addScriptFromTemplate(ScriptTemplate::Mandelbrot());
|
|
||||||
addScriptFromTemplate(ScriptTemplate::Polynomial());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptStore::deleteAllScripts() {
|
void ScriptStore::deleteAllScripts() {
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ private:
|
|||||||
* k_fullFreeSpaceSizeLimit, we consider the script store as full.
|
* k_fullFreeSpaceSizeLimit, we consider the script store as full.
|
||||||
* To be able to add a new empty record, the available space should at least
|
* To be able to add a new empty record, the available space should at least
|
||||||
* be able to store a Script with default name and its extension, the
|
* be able to store a Script with default name and its extension, the
|
||||||
* importation status (1 char), the default content "from math import *\n"
|
* importation status (1 char), the cursor (2 char), the default content "from math import *\n"
|
||||||
* (20 char) and 10 char of free space. */
|
* (20 char) and 10 char of free space. */
|
||||||
static constexpr int k_fullFreeSpaceSizeLimit = sizeof(Ion::Storage::record_size_t)+Script::k_defaultScriptNameMaxSize+k_scriptExtensionLength+1+20+10;
|
static constexpr int k_fullFreeSpaceSizeLimit = sizeof(Ion::Storage::record_size_t)+Script::k_defaultScriptNameMaxSize+k_scriptExtensionLength+1+20+10;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -5,103 +5,9 @@ namespace Code {
|
|||||||
constexpr ScriptTemplate emptyScriptTemplate(".py", "\x01" R"(from math import *
|
constexpr ScriptTemplate emptyScriptTemplate(".py", "\x01" R"(from math import *
|
||||||
)");
|
)");
|
||||||
|
|
||||||
constexpr ScriptTemplate squaresScriptTemplate("squares.py", "\x01" R"(from math import *
|
|
||||||
from turtle import *
|
|
||||||
def squares(angle=0.5):
|
|
||||||
reset()
|
|
||||||
L=330
|
|
||||||
speed(10)
|
|
||||||
penup()
|
|
||||||
goto(-L/2,-L/2)
|
|
||||||
pendown()
|
|
||||||
for i in range(660):
|
|
||||||
forward(L)
|
|
||||||
left(90+angle)
|
|
||||||
L=L-L*sin(angle*pi/180)
|
|
||||||
hideturtle())");
|
|
||||||
|
|
||||||
constexpr ScriptTemplate mandelbrotScriptTemplate("mandelbrot.py", "\x01" R"(# This script draws a Mandelbrot fractal set
|
|
||||||
# N_iteration: degree of precision
|
|
||||||
import kandinsky
|
|
||||||
def mandelbrot(N_iteration):
|
|
||||||
for x in range(320):
|
|
||||||
for y in range(222):
|
|
||||||
# Compute the mandelbrot sequence for the point c = (c_r, c_i) with start value z = (z_r, z_i)
|
|
||||||
z = complex(0,0)
|
|
||||||
# Rescale to fit the drawing screen 320x222
|
|
||||||
c = complex(3.5*x/319-2.5, -2.5*y/221+1.25)
|
|
||||||
i = 0
|
|
||||||
while (i < N_iteration) and abs(z) < 2:
|
|
||||||
i = i + 1
|
|
||||||
z = z*z+c
|
|
||||||
# Choose the color of the dot from the Mandelbrot sequence
|
|
||||||
rgb = int(255*i/N_iteration)
|
|
||||||
col = kandinsky.color(int(rgb*0.82),int(rgb*0.13),int(rgb*0.18))
|
|
||||||
# Draw a pixel colored in 'col' at position (x,y)
|
|
||||||
kandinsky.set_pixel(x,y,col))");
|
|
||||||
|
|
||||||
constexpr ScriptTemplate polynomialScriptTemplate("polynomial.py", "\x01" R"(from math import *
|
|
||||||
# roots(a,b,c) computes the solutions of the equation a*x**2+b*x+c=0
|
|
||||||
def roots(a,b,c):
|
|
||||||
delta = b*b-4*a*c
|
|
||||||
if delta == 0:
|
|
||||||
return -b/(2*a)
|
|
||||||
elif delta > 0:
|
|
||||||
x_1 = (-b-sqrt(delta))/(2*a)
|
|
||||||
x_2 = (-b+sqrt(delta))/(2*a)
|
|
||||||
return x_1, x_2
|
|
||||||
else:
|
|
||||||
return None)");
|
|
||||||
|
|
||||||
constexpr ScriptTemplate parabolaScriptTemplate("parabola.py", "\x01" R"(from matplotlib.pyplot import *
|
|
||||||
from math import *
|
|
||||||
|
|
||||||
g=9.81
|
|
||||||
|
|
||||||
def x(t,v_0,alpha):
|
|
||||||
return v_0*cos(alpha)*t
|
|
||||||
def y(t,v_0,alpha,h_0):
|
|
||||||
return -0.5*g*t**2+v_0*sin(alpha)*t+h_0
|
|
||||||
|
|
||||||
def vx(v_0,alpha):
|
|
||||||
return v_0*cos(alpha)
|
|
||||||
def vy(t,v_0,alpha):
|
|
||||||
return -g*t+v_0*sin(alpha)
|
|
||||||
|
|
||||||
def t_max(v_0,alpha,h_0):
|
|
||||||
return (v_0*sin(alpha)+sqrt((v_0**2)*(sin(alpha)**2)+2*g*h_0))/g
|
|
||||||
|
|
||||||
def simulation(v_0=15,alpha=pi/4,h_0=2):
|
|
||||||
tMax=t_max(v_0,alpha,h_0)
|
|
||||||
accuracy=1/10**(floor(log10(tMax))-1)
|
|
||||||
T_MAX=floor(tMax*accuracy)+1
|
|
||||||
X=[x(t/accuracy,v_0,alpha) for t in range(T_MAX)]
|
|
||||||
Y=[y(t/accuracy,v_0,alpha,h_0) for t in range(T_MAX)]
|
|
||||||
VX=[vx(v_0,alpha) for t in range(T_MAX)]
|
|
||||||
VY=[vy(t/accuracy,v_0,alpha) for t in range(T_MAX)]
|
|
||||||
for i in range(T_MAX):
|
|
||||||
arrow(X[i],Y[i],VX[i]/accuracy,VY[i]/accuracy)
|
|
||||||
grid()
|
|
||||||
show())");
|
|
||||||
|
|
||||||
const ScriptTemplate * ScriptTemplate::Empty() {
|
const ScriptTemplate * ScriptTemplate::Empty() {
|
||||||
return &emptyScriptTemplate;
|
return &emptyScriptTemplate;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ScriptTemplate * ScriptTemplate::Squares() {
|
|
||||||
return &squaresScriptTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ScriptTemplate * ScriptTemplate::Mandelbrot() {
|
|
||||||
return &mandelbrotScriptTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ScriptTemplate * ScriptTemplate::Polynomial() {
|
|
||||||
return &polynomialScriptTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ScriptTemplate * ScriptTemplate::Parabola() {
|
|
||||||
return ¶bolaScriptTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,6 @@ class ScriptTemplate {
|
|||||||
public:
|
public:
|
||||||
constexpr ScriptTemplate(const char * name, const char * value) : m_name(name), m_value(value) {}
|
constexpr ScriptTemplate(const char * name, const char * value) : m_name(name), m_value(value) {}
|
||||||
static const ScriptTemplate * Empty();
|
static const ScriptTemplate * Empty();
|
||||||
static const ScriptTemplate * Squares();
|
|
||||||
static const ScriptTemplate * Mandelbrot();
|
|
||||||
static const ScriptTemplate * Polynomial();
|
|
||||||
static const ScriptTemplate * Parabola();
|
|
||||||
const char * name() const { return m_name; }
|
const char * name() const { return m_name; }
|
||||||
const char * content() const { return m_value + Script::StatusSize(); }
|
const char * content() const { return m_value + Script::StatusSize(); }
|
||||||
const char * value() const { return m_value; }
|
const char * value() const { return m_value; }
|
||||||
|
|||||||
27
apps/code/test/toolbox_ion_keys_dummy.cpp
Normal file
27
apps/code/test/toolbox_ion_keys_dummy.cpp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#include "../toolbox_ion_keys.h"
|
||||||
|
|
||||||
|
namespace Code {
|
||||||
|
ToolboxIonKeys::ToolboxIonKeys() :
|
||||||
|
ViewController(nullptr),
|
||||||
|
m_view()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ToolboxIonKeys::handleEvent(Ion::Events::Event e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolboxIonKeys::toolboxIonView::toolboxIonView():
|
||||||
|
View()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolboxIonKeys::toolboxIonView::drawRect(KDContext * ctx, KDRect rect) const {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
View * ToolboxIonKeys::view(){
|
||||||
|
return &m_view;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -40,7 +40,7 @@ void assert_variables_are(const char * script, const char * nameToComplete, cons
|
|||||||
&addParentheses,
|
&addParentheses,
|
||||||
i,
|
i,
|
||||||
&index);
|
&index);
|
||||||
quiz_assert(i == index); // If false, the autompletion has cycled: there are not as many results as expected
|
quiz_assert(i == index); // If false, the autocompletion has cycled: there are not as many results as expected
|
||||||
quiz_assert(strncmp(*(expectedVariables + i), autocompletionI - nameToCompleteLength, textToInsertLength + nameToCompleteLength) == 0);
|
quiz_assert(strncmp(*(expectedVariables + i), autocompletionI - nameToCompleteLength, textToInsertLength + nameToCompleteLength) == 0);
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
@@ -63,7 +63,7 @@ QUIZ_CASE(variable_box_controller) {
|
|||||||
};
|
};
|
||||||
// FIXME This test does not load imported variables for now
|
// FIXME This test does not load imported variables for now
|
||||||
assert_variables_are(
|
assert_variables_are(
|
||||||
"\x01 from math import *\nfroo=3",
|
"\x01\x01\x01 from math import *\nfroo=3",
|
||||||
"fr",
|
"fr",
|
||||||
expectedVariables,
|
expectedVariables,
|
||||||
sizeof(expectedVariables) / sizeof(const char *));
|
sizeof(expectedVariables) / sizeof(const char *));
|
||||||
|
|||||||
@@ -4,3 +4,7 @@ Modules = "Module"
|
|||||||
LoopsAndTests = "Schleifen und Tests"
|
LoopsAndTests = "Schleifen und Tests"
|
||||||
Files = "Dateien"
|
Files = "Dateien"
|
||||||
Exceptions = "Ausnahmen"
|
Exceptions = "Ausnahmen"
|
||||||
|
UlabDocumentation = "Dokumentation"
|
||||||
|
IonSelector = "Schlüsselauswahl"
|
||||||
|
PressAKey = "drücke eine Taste"
|
||||||
|
IonKeyList = "Liste der Schlüssel"
|
||||||
|
|||||||
@@ -4,3 +4,7 @@ Modules = "Modules"
|
|||||||
LoopsAndTests = "Loops and tests"
|
LoopsAndTests = "Loops and tests"
|
||||||
Files = "Files"
|
Files = "Files"
|
||||||
Exceptions = "Exceptions"
|
Exceptions = "Exceptions"
|
||||||
|
UlabDocumentation = "Documentation"
|
||||||
|
IonSelector = "Key selector"
|
||||||
|
PressAKey = "Press a key"
|
||||||
|
IonKeyList = "List of keys"
|
||||||
|
|||||||
@@ -4,3 +4,7 @@ Modules = "Modules"
|
|||||||
LoopsAndTests = "Loops and tests"
|
LoopsAndTests = "Loops and tests"
|
||||||
Files = "Files"
|
Files = "Files"
|
||||||
Exceptions = "Exceptions"
|
Exceptions = "Exceptions"
|
||||||
|
UlabDocumentation = "Documentación"
|
||||||
|
IonSelector = "Selector de llave"
|
||||||
|
PressAKey = "presione una tecla"
|
||||||
|
IonKeyList = "Lista de llaves"
|
||||||
|
|||||||
@@ -4,3 +4,7 @@ Modules = "Modules"
|
|||||||
LoopsAndTests = "Boucles et tests"
|
LoopsAndTests = "Boucles et tests"
|
||||||
Files = "Fichiers"
|
Files = "Fichiers"
|
||||||
Exceptions = "Exceptions"
|
Exceptions = "Exceptions"
|
||||||
|
UlabDocumentation = "Documentation"
|
||||||
|
IonSelector = "Sélecteur de touche"
|
||||||
|
PressAKey = "Appuyez sur une touche"
|
||||||
|
IonKeyList = "Liste des touches"
|
||||||
|
|||||||
@@ -4,3 +4,7 @@ Modules = "Modulok"
|
|||||||
LoopsAndTests = "Hurkok és tesztek"
|
LoopsAndTests = "Hurkok és tesztek"
|
||||||
Files = "Fájlok"
|
Files = "Fájlok"
|
||||||
Exceptions = "Kivételek"
|
Exceptions = "Kivételek"
|
||||||
|
UlabDocumentation = "Dokumentáció"
|
||||||
|
IonSelector = "Kulcsválasztó"
|
||||||
|
PressAKey = "Nyomj meg egy gombot"
|
||||||
|
IonKeyList = "A kulcsok listája"
|
||||||
|
|||||||
@@ -2,5 +2,9 @@ Functions = "Funzioni"
|
|||||||
Catalog = "Catalogo"
|
Catalog = "Catalogo"
|
||||||
Modules = "Moduli"
|
Modules = "Moduli"
|
||||||
LoopsAndTests = "Cicli e test"
|
LoopsAndTests = "Cicli e test"
|
||||||
Files = "Files"
|
Files = "File"
|
||||||
Exceptions = "Exceptions"
|
Exceptions = "Eccezioni"
|
||||||
|
UlabDocumentation = "Documentazione"
|
||||||
|
IonSelector = "Selettore tasti"
|
||||||
|
PressAKey = "Premi un tasto"
|
||||||
|
IonKeyList = "Elenco dei tasti"
|
||||||
|
|||||||
@@ -4,3 +4,7 @@ Modules = "Modules"
|
|||||||
LoopsAndTests = "Herhalingen en testen"
|
LoopsAndTests = "Herhalingen en testen"
|
||||||
Files = "Files"
|
Files = "Files"
|
||||||
Exceptions = "Exceptions"
|
Exceptions = "Exceptions"
|
||||||
|
UlabDocumentation = "Documentatie"
|
||||||
|
IonSelector = "Toetsenkiezer"
|
||||||
|
PressAKey = "druk op een knop"
|
||||||
|
IonKeyList = "Lijst met sleutels"
|
||||||
|
|||||||
@@ -4,3 +4,7 @@ Modules = "Módulos"
|
|||||||
LoopsAndTests = "Laços e testes"
|
LoopsAndTests = "Laços e testes"
|
||||||
Files = "Files"
|
Files = "Files"
|
||||||
Exceptions = "Exceptions"
|
Exceptions = "Exceptions"
|
||||||
|
UlabDocumentation = "Documentação"
|
||||||
|
IonSelector = "Seletor de chave"
|
||||||
|
PressAKey = "Pressione uma tecla"
|
||||||
|
IonKeyList = "Lista de chaves"
|
||||||
|
|||||||
@@ -3,9 +3,21 @@ IonModule = "ion"
|
|||||||
KandinskyModule = "kandinsky"
|
KandinskyModule = "kandinsky"
|
||||||
MathModule = "math"
|
MathModule = "math"
|
||||||
MatplotlibPyplotModule = "matplotlib.pyplot"
|
MatplotlibPyplotModule = "matplotlib.pyplot"
|
||||||
|
NumpyModule = "numpy"
|
||||||
|
NumpyFftModule = "fft"
|
||||||
|
NumpyLinalgModule = "linalg"
|
||||||
|
ScipyModule = "scipy"
|
||||||
|
ScipyLinalgModule = "linalg"
|
||||||
|
ScipyOptimizeModule = "optimize"
|
||||||
|
ScipySignalModule = "signal"
|
||||||
|
ScipySpecialModule = "special"
|
||||||
|
NumpyNdarray = "ndarray"
|
||||||
|
UtilsModule = "utils"
|
||||||
OsModule = "os"
|
OsModule = "os"
|
||||||
|
SysModule = "sys"
|
||||||
TimeModule = "time"
|
TimeModule = "time"
|
||||||
TurtleModule = "turtle"
|
TurtleModule = "turtle"
|
||||||
|
UlabModule = "ulab"
|
||||||
ForLoopMenu = "For"
|
ForLoopMenu = "For"
|
||||||
IfStatementMenu = "If"
|
IfStatementMenu = "If"
|
||||||
WhileLoopMenu = "While"
|
WhileLoopMenu = "While"
|
||||||
@@ -57,5 +69,4 @@ PythonCommandDef = "def \x11():\n "
|
|||||||
PythonCommandDefWithArg = "def function(x):"
|
PythonCommandDefWithArg = "def function(x):"
|
||||||
PythonCommandReturn = "return "
|
PythonCommandReturn = "return "
|
||||||
RandomModule = "random"
|
RandomModule = "random"
|
||||||
IonSelector = "Key selector"
|
UlabDocumentationLink = "micropython-ulab.readthedocs.io"
|
||||||
PressAKey = "Press a key"
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user