π
<-
Chat plein-écran
[^]

La NumWorks réinventée avec la N0110 - rentrée 2019

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Message non lude parisse » 14 Aoû 2019, 08:20

Un point sur le projet delta (= epsilon + giac sur Numworks N110)

Etat actuel: le prototype du simulateur est fonctionnel (qualite version alpha). J'ai reussi a compiler un firmware pour une N110.
Attention, les instructions qui suivent permettent de compiler un firmware qui lie entre eux epsilon et giac, dont les licenses sont incompatibles. Il n'est donc pas possible de diffuser legalement un tel firmware, on peut juste se compiler son propre firmware pour soi a des fins de prototypage.

Les commandes Giac/Xcas sont utilisables depuis l'app Calculs. Pour le moment, il faut taper les commandes Xcas en toutes lettres. On peut utiliser les templates de la calculatrice (fraction, integrale, somme, matrices). Pour stocker une valeur dans une variable, utiliser =, par exemple a=2 ou a=ranm(2,2).
Remarque: comme epsilon/poincare n'accepte pas les fonctions utilisateur ayant plus d'un argument, j'ai mis en place un workaround dans giac pour transformer de matrice 1 ligne vers liste des arguments (et aussi autorise les fonctions a plus d'un argument dans le parseur de poincare). Cela apparait dans l'historique des calculs avec des crochets qu'il faut juste ignorer. Le seul cas vraiment genant pour le lycee me semble etre la fonction limit qui meriterait un template.

=================
Compilation giac
=================
Recuperer https://www-fourier.ujf-grenoble.fr/~pa ... stable.tgz (version du 24 aout ou ulterieure)
Compilation de giac pour le simulateur:
Code: Tout sélectionner
export CXXFLAGS='-DNUMWORKS -g'
./configure --prefix=/usr
make
sudo make install


Compilation pour la calculatrice, d'apres
https://zardam.github.io/post/numworks-giac/
Installer libtommath: voir lien ci-dessus
Pour giac: dans le repertoire src:
Code: Tout sélectionner
cp config.h.numworks config.h
cp static_lexer_numworks.h static_lexer.h
cp static_lexer__numworks.h static_lexer_.h
make -f Makefile.numworks


==============
Compilation epsilon
==============
Code: Tout sélectionner
git clone -b newlib https://github.com/zardam/epsilon
# faire les modifs dans le source indiquees ci-dessous!
# faire make V=1 pour voir les details

# make PLATFORM=emscripten

# simulateur:
make PLATFORM=simulator clean
make PLATFORM=simulator DEBUG=1
./emu (a linker build/simulator/epsilon.elf)

# calculatrice:
make clean
make
# N100
# make epsilon_flash
# flashage calculatrice N110
# sudo est inutile sur Mac
make USE_LIBA=0 EPSILON_DEVICE_BENCH=0 EPSILON_USB_DFU_XIP=0 EPSILON_ONBOARDING_APP=1 EPSILON_BOOT_PROMPT=update build/device/n0110/epsilon_two_binaries -j
sudo dfu-util -D build/device/n0110/epsilon.internal.bin -s 0x08000000
sudo dfu-util -D build/device/n0110/epsilon.external.bin -s 0x90000000


================
Modifications du source d'epsilon pour linker avec giac:
================
definitions des flags C++ dans scripts/default.mak

1/ scripts/config.mak: ajouter
Code: Tout sélectionner
# giac
ifeq ($(PLATFORM),device)
SFLAGS += -DGIAC_NUMWORKS
LDFLAGS += -L../giac-1.5.0/src -L../libtommath-0.39 -lgiac -ltommath
endif

ifeq ($(PLATFORM),emscripten)
SFLAGS += -DGIAC_NUMWORKS
LDFLAGS += -O3 -v -s TOTAL_MEMORY=1GB -s LEGACY_GL_EMULATION=1 -s GL_UNSAFE_OPTS=0 --memory-init-file 0 -s ASSERTIONS=1 -s ERROR_ON_UNDEFINED_SYMBOLS=0 -L/home/parisse/emgiac/giac  -lgiac -lpari -lmpfi -lmpfr -lgmp -lglpk --js-library /home/parisse/emgiac/giac/time.js
endif

ifeq ($(PLATFORM),simulator)
SFLAGS += -DGIAC_NUMWORKS
LDFLAGS += -lgiac
endif


2/ apps/calculation:
au debut de calculation.cpp (avant namespace ...)
Code: Tout sélectionner
#ifdef GIAC_NUMWORKS
  extern "C" const char * caseval(const char *);
#endif

plus loin

Code: Tout sélectionner
void Calculation::setContent(const char * c, Context * context, Expression ansExpression) {
  reset();
#ifdef GIAC_NUMWORKS
  Preferences * preferences = Preferences::sharedPreferences();
  if (preferences->angleUnit() == Preferences::AngleUnit::Radian)
    caseval("angle_radian:=1");
  else
    caseval("angle_radian:=0");
  char buf[1024]="add_autosimplify(";
  strlcpy(&buf[strlen(buf)],c,sizeof(buf)-strlen(buf));
  buf[strlen(buf)+1]=0;
  buf[strlen(buf)]=')';
  const char * out=caseval(buf);
  strlcpy(m_inputText,c,sizeof(m_inputText));
  strlcpy(m_exactOutputText,out,sizeof(m_exactOutputText));
  strlcpy(buf,"evalf(",sizeof(buf));
  strlcpy(&buf[strlen(buf)],out,sizeof(buf)-strlen(buf));
  buf[strlen(out)+7]=0;
  buf[strlen(out)+6]=')';
  out=caseval(buf);
  if (strcmp(out,m_exactOutputText)==0 || (m_exactOutputText[0]=='[' && out[0]!='[')){
    bool undef=false;
    int l=strlen(m_exactOutputText);
    for (int i=0;i<l;++i){
      char ch=m_exactOutputText[i];
      if ( (ch>='a' && ch<='z') || (ch>='A' && ch<='Z')){
   undef=true;
   break;
      }
    }
    strlcpy(m_approximateOutputText,undef?"undef":m_exactOutputText,sizeof(m_approximateOutputText));
  }
  else
    strlcpy(m_approximateOutputText,out,sizeof(m_approximateOutputText));
#else
  {
    Symbol ansSymbol = Symbol::Ans();
    Expression input = Expression::Parse(c).replaceSymbolWithExpression(ansSymbol, ansExpression);
    /* We do not store directly the text enter by the user because we do not want
     * to keep Ans symbol in the calculation store. */
    PoincareHelpers::Serialize(input, m_inputText, sizeof(m_inputText));
  }
  Expression exactOutput;
  Expression approximateOutput;
  PoincareHelpers::ParseAndSimplifyAndApproximate(m_inputText, &exactOutput, &approximateOutput, *context, false);
  PoincareHelpers::Serialize(exactOutput, m_exactOutputText, sizeof(m_exactOutputText));
  PoincareHelpers::Serialize(approximateOutput, m_approximateOutputText, sizeof(m_approximateOutputText));
#endif
}


3/ dans poincare/include/poincare/symbol_abstract.h: constexpr static size_t k_maxNameSize = 8;
a remplacer par 16

4/ dans poincare/src/parsing, parser.cpp, fonction void Parser::parseCustomIdentifier
Code: Tout sélectionner
  ...
  assert(!parameter.isUninitialized());
#ifdef GIAC_NUMWORKS
  if (parameter.numberOfChildren() == 1)
    parameter = parameter.childAtIndex(0);   
#else
  if (parameter.numberOfChildren() != 1) {
    m_status = Status::Error; // Unexpected number of paramters.
    return;
  }
  parameter = parameter.childAtIndex(0);
#endif
  ...


5/ Pour visualiser qu'on utilise le moteur de calcul de Xcas, on peut par exemple modifier la couleur d'affichage de deg/rad en rouge:
dans apps/title_bar_view.cpp
Code: Tout sélectionner
TitleBarView::TitleBarView() :
  View(),
  m_titleView(KDFont::SmallFont, I18n::Message::Default, 0.5f, 0.5f, KDColorWhite, Palette::YellowDark), // YellowDark
  m_preferenceView(KDFont::SmallFont, 1.0f, 0.5, KDColorWhite, Palette::Red) // YellowDark
{
  m_examModeIconView.setImage(ImageStore::ExamIcon);
}

Pour avoir les angles en radian au boot
poincare/src/preferences.cpp m_angleUnit(AngleUnit::Radian),

6/ pour modifier les menus de la Toolbox, modifier apps/math_toolbox.cpp
les noms doivent etre definis dans apps/shared.universal.i18n ou/et apps/shared.[langue].i18n
par exemple
SimplifyCommandWithArg = "simplify(f)"
SimplifyValue = "simplify expression"
attention, faire clean ou deux fois make sinon les messages sont decales

7/ dans le fichier ion/src/device/n0110/flash.ld J'ai singe le fichier correspondant du port de zardam en ajoutant
Code: Tout sélectionner
  .ARM.exidx : {
    __exidx_start = .;
     *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    __exidx_end = .;
  } >INTERNAL_FLASH

juste avant la section .data

8/ dans ion/src/device/shared/boot/rt0.cpp, dans la fonction start()
deplacer Ion::Device::Board::init(); avant
#define SUPPORT_CPP_GLOBAL_CONSTRUCTORS
et modifier la valeur de ce define a 1 (initialement a 0)

9/ Ayant une erreur de linkage relative a __errno entre flash interne et flash externe, j'ai desactive la verification dans ion/src/device/n0110/flash.ld:
/* NOCROSSREFS_TO(.text.external .text.internal); */
Dernière édition par parisse le 24 Aoû 2019, 16:10, édité 11 fois.
Avatar de l’utilisateur
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 77.2%
 
Messages: 3500
Inscription: 13 Déc 2013, 16:35
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Message non lude parisse » 15 Aoû 2019, 08:43

Post precedent mis a jour.
Avatar de l’utilisateur
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 77.2%
 
Messages: 3500
Inscription: 13 Déc 2013, 16:35
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Message non lude Adriweb » 16 Aoû 2019, 05:39

Ce serait bien de forker le repo Epsilon et committer lesdites modifs, afin que l'on puisse [a]voir les changements directement dans un repo utilisable :D
Image

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
Avatar de l’utilisateur
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 80.1%
 
Messages: 14605
Images: 1216
Inscription: 01 Juin 2007, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: adriweb
GitHub: adriweb

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Message non lude parisse » 16 Aoû 2019, 07:13

Peut-etre, mais je ne sais pas gerer ensuite les modifications concurrentes. Je prefere expliquer les changements que je fais, comme ca quelqu'un (par exemple moi) qui relit le post dans quelques semaines ou mois devrait pouvoir arriver a modifier la version courante de epsilon. Je trouve que c'est plus facile de reperer une fonction dans un fichier que des numeros de lignes en vert ou rouge au milieu de nulle part.
C'est peut-etre aussi une question d'habitude d'outils a utiliser: si quelqu'un veut forker avec mes modifs, je n'y vois pas d'inconvenients.
Avatar de l’utilisateur
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 77.2%
 
Messages: 3500
Inscription: 13 Déc 2013, 16:35
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Message non lude Adriweb » 16 Aoû 2019, 07:19

Hmm c'est le principe d'un patch. Git(hub) peut exporter en patch tout autant lisible.
Bref, il faudrait que quelqu'un comme Zardam prenne quelques minutes à faire ça, lui qui a l'expérience avec la compile de toutes les dépendances :D

Avec des services du genre Travis, il pourrait y avoir des builds automatiques, et si ça suit les git rebase, et bien ça sera à jour avec les versions de NumWorks.
Image

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
Avatar de l’utilisateur
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 80.1%
 
Messages: 14605
Images: 1216
Inscription: 01 Juin 2007, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: adriweb
GitHub: adriweb

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Message non lude parisse » 16 Aoû 2019, 08:41

Oui, ca a l'avantage d'etre automatique, ca complete mon post qui est explicatif. Je viens d'ailleurs de l'editer, en y ajoutant comment modifier les menus pour y faire apparaitre de nouvelles commandes. Je vais essayer de faire un menu CAS pour le lycee.
Restera a regler les problemes de licence, pour le moment la licence non commerciale de giac est la GPL qui est incompatible avec la licence d'epsilon. Ca ne pose pas de probleme pour faire du prototypage pour quelques developpeurs interesses, mais ca risque de poser des problemes de redistribution. Sauf si on peut considerer que le firmware de base epsilon est une librairie systeme et giac une application GPL. Mais j'ai le sentiment que pour l'application Calculs ca n'est pas possible car l'utilisation se fait dans l'autre sens. Il faudrait donc soit refaire une app de calcul de zero, soit que Numworks accepte de dual-licenser l'app de calcul sous licence GPL. La 1ere option me semble la meilleure a long terme, mais ca prendra du temps et ca n'a d'interet que si ca suit sur le hardware.
Ce serait donc bien si quelqu'un ayant acces a la nouvelle machine et une ame de developpeur pouvait tester que ca marche (je vais de mon cote tester si ca compile correctement sur ARM).
Avatar de l’utilisateur
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 77.2%
 
Messages: 3500
Inscription: 13 Déc 2013, 16:35
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Message non lude parisse » 16 Aoû 2019, 09:11

Je viens de tester, modulo une petite correction pour isalpha (faite dans le post ci-dessus), la compilation fonctionne pour arm, mais pas l'etape de link. Il y a plein de symboles non definis, qui correspondent au fait que la libstdc++ n'est pas presente. Il va falloir attendre que zardam nous explique comment il a fait pour linker, ou bien il va falloir que je compile la ustl pour Numworks et que je configure giac pour l'utiliser.
Avatar de l’utilisateur
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 77.2%
 
Messages: 3500
Inscription: 13 Déc 2013, 16:35
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Message non lude parisse » 16 Aoû 2019, 15:20

J'ai progresse, en fait la toolchain ARM contient la newlib et permet d'utiliser la libstdc++, mais il faut l'ajouter explicitement dans les flags de link:
Code: Tout sélectionner
/usr/lib/arm-none-eabi/newlib/thumb/v7e-m/fpv4-sp/hard/libstdc++_nano.a /usr/lib/arm-none-eabi/newlib/thumb/v7e-m/fpv4-sp/hard/libc_nano.a /usr/lib/gcc/arm-none-eabi/7.3.1/thumb/v7e-m/fpv4-sp/hard/libgcc.a /usr/lib/arm-none-eabi/newlib/thumb/v7e-m/fpv4-sp/hard/libnosys.a

Mais il reste encore 3 symboles indefinis, et la je ne sais pas comment faire
Code: Tout sélectionner
/usr/lib/gcc/arm-none-eabi/7.3.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/7.3.1/thumb/v7e-m/fpv4-sp/hard/libgcc.a(unwind-arm.o): in function `get_eit_entry':
/build/gcc-arm-none-eabi-76K7U5/gcc-arm-none-eabi-7-2018-q2/build/arm-none-eabi/thumb/v7e-m/fpv4-sp/hard/libgcc/../../../../../../../libgcc/unwind-arm-common.inc:275: undefined reference to `__exidx_end'
/usr/lib/gcc/arm-none-eabi/7.3.1/../../../arm-none-eabi/bin/ld: /build/gcc-arm-none-eabi-76K7U5/gcc-arm-none-eabi-7-2018-q2/build/arm-none-eabi/thumb/v7e-m/fpv4-sp/hard/libgcc/../../../../../../../libgcc/unwind-arm-common.inc:275: undefined reference to `__exidx_start'
/usr/lib/gcc/arm-none-eabi/7.3.1/../../../arm-none-eabi/bin/ld: /usr/lib/arm-none-eabi/newlib/thumb/v7e-m/fpv4-sp/hard/libnosys.a(sbrk.o): in function `_sbrk':
/build/newlib-hTUQk9/newlib-3.1.0.20181231/build/arm-none-eabi/thumb/v7e-m/fpv4-sp/hard/libgloss/libnosys/../../../../../../../../libgloss/libnosys/sbrk.c:21: undefined reference to `end'
collect2: error: ld returned 1 exit status
Avatar de l’utilisateur
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 77.2%
 
Messages: 3500
Inscription: 13 Déc 2013, 16:35
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Message non lude parisse » 16 Aoû 2019, 16:05

J'ai fini par comprendre que ces symboles manquants doivent etre definis dans le fichier ion/src/device/n0110. J'ai singe le fichier correspondant du port de zardam en ajoutant
Code: Tout sélectionner
  .ARM.exidx : {
    __exidx_start = .;
     *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    __exidx_end = .;
  } >INTERNAL_FLASH

juste avant la section .data, et ajoute end = _heap_start; dans la section _heap_start. Ensuite ca linke et ca cree 2 fichiers, un de 18K pour la flash interne et un de 5M pour la flash externe.
Avatar de l’utilisateur
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 77.2%
 
Messages: 3500
Inscription: 13 Déc 2013, 16:35
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: La NumWorks réinventée avec la N0110 - rentrée 2019

Message non lude gabmiral » 16 Aoû 2019, 18:06

Dans la partie 3, le tableau de performances, je m'interroge sur les performances des TI-83 Premium CE. Pour le modèle Edition Python, ce qui a été testé a été codé en Basic z80/assembleur ou en Python ? Il faudrait spécifier. Aussi, ce serait interessant de mettre la vitesse d’exécution du script Python sur une TI-83 Premium CE normale couplée au module TI-Python
Avatar de l’utilisateur
gabmiral
Niveau 7: EP (Espèce Protégée: geek)
Niveau 7: EP (Espèce Protégée: geek)
Prochain niv.: 95.3%
 
Messages: 11
Inscription: 08 Juil 2019, 18:35
Localisation: Hauts-de-France
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile
Classe: TC02 UTC
YouTube: Gabmiral
GitHub: gabmiral

PrécédenteSuivante

Retourner vers News NumWorks

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 22 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1028 utilisateurs:
>1006 invités
>17 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)