Posté le 16/04/2019 20:58
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 71 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 25/04/2019 21:22 | #
Je vais essayer en testant tous les timers jusqu'a en trouver un inutilise.
Mauvaise idée, si je peux me permettre.
Citer : Posté le 25/04/2019 21:24 | #
Ce qui m'etonne c'est qu'en principe j'arrete bien les timers! Il y a un couple set_abort() clear_abort() autour des evaluations.
Ajouté le 25/04/2019 à 21:35 :
Le code qui gere les timers est le suivant:
int execution_in_progress = 0; // set to 1 during program execution
static void check_execution_abort() {
if (execution_in_progress) {
// HourGlass();
unsigned int key=0;
int res = GetKeyWait(KEYWAIT_HALTOFF_TIMEROFF,0,1,&key);//PRGM_GetKey_();
if(res==KEYREP_KEYEVENT && key == KEY_CTRL_AC){
puts("ACON");
esc_flag = 1;
}
}
}
static int aborttimer = 0;
void set_abort(){
for (int i=1;i<=5;++i){
aborttimer=SetTimer(i,100,check_execution_abort);
if (aborttimer==i)
return;
aborttimer=-1;
// aborttimer = Timer_Install(0, check_execution_abort, 100);
// if (aborttimer > 0) { Timer_Start(aborttimer); }
}
void clear_abort(){
if (aborttimer > 0) {
KillTimer(aborttimer);
//Timer_Stop(aborttimer);
//Timer_Deinstall(aborttimer);
}
}
Autour de chaque evaluation il y a un couple execution_in_progress=1; set_abort(); ... clear_abort(); execution_in_progress=0;
Pendant une evaluation il y a des couples clear_abort()... set_abort() dans la fonction input et pour les mises a jour VRAM vers ecran.
Ajouté le 25/04/2019 à 22:00 :
Bon, en mettant des affichages, j'ai compris ce qui ne va pas, c'est que la valeur renvoyee par SetTimer est decalee de 5 de la valeur passee en argument. Apres ca, le handler de sortie fonctionne.
Ajouté le 25/04/2019 à 22:11 :
Par contre le timer ne fonctionne pas, impossible d'interrompre en appuyant sur AC/ON, le test
...
GetKeyWait(KEYWAIT_HALTOFF_TIMEROFF,0,1,&key);//PRGM_GetKey_();
if(res==KEYREP_KEYEVENT && key == KEY_CTRL_AC){
puts("ACON");
esc_flag = 1;
n'est pas pris.
Ajouté le 26/04/2019 à 08:35 :
Apparamment, key n'est pas modifie par GetKeyWait (d'ou peut-etre le "broken?" dans https://bible.planet-casio.com/simlo/chm/v20/fx_legacy_syscalls.htm). IsKeyDown et IsKeyUp crashent. Si je mets un GetKey(&key) lorsque res==KEYREP_KEYEVENT ca bloque. Donc je ne sais pas quoi utiliser pour tester la touche ON, pour le moment je vais interrompre des qu'une touche est pressee.
Citer : Posté le 26/04/2019 08:47 | #
Ça c'est à cause des numéros de timers :
are software timers that run on ETMU0. The status of ETMU0 is special.
v- Used to run the software timers
Timer numbers 0 1 2 3 4 5 6 7 8 9 10
+-- ETMU ---+ +-- Software ---+
Les timers que tu manipules sont numérotés à partir de 5.
Oui, GetKeyWait() a exactement ce problème. Je ne sais pas pourquoi IsKeyDown() crashe ici, mais c'est tant mieux à la limite. GetKey() bloque toujours. La solution est d'utiliser le syscall GetKeyWait(), qui lui marche.
Citer : Posté le 26/04/2019 09:43 | #
Donc pas de possibilite de tester si c'est bien la touche ON qui est pressee?
Sinon, je constate que RTC_GetTicks() fonctionne. On va pouvoir mettre a l'heure et l'afficher, utile en situation d'examen (les etudiants n'ont plus de montre).
Citer : Posté le 26/04/2019 10:06 | #
Si, tu peux utiliser le syscall GetKeyWait(). Attention, comme d'habitude si plusieurs touches sont pressées à la fois ça n'en donne qu'une.
Citer : Posté le 26/04/2019 11:10 | #
Je n'y arrive pas avec GetKeyWait, car il ne met rien dans la variable key avec l'appel GetKeyWait(KEYWAIT_HALTOFF_TIMEROFF,0,1,&key)
Citer : Posté le 26/04/2019 11:36 | #
Tu as bien implémenté l'appel de syscall ? Pour éviter les conflits d'édition des liens, tu devrais lui donner un nom différent.
Citer : Posté le 26/04/2019 12:24 | #
Je n'ai rien fait pour lui, car il etait dans le sdk.
Citer : Posté le 26/04/2019 12:45 | #
C'est bien ça le problème, la version SDK est cassée. Pas le syscall.
Citer : Posté le 26/04/2019 12:54 | #
C'est bien 0x247?
Ajouté le 26/04/2019 à 13:06 :
Ca crashe avec 0x247. Tant pis, ca interrompra avec n'importe quelle touche.
Citer : Posté le 26/04/2019 13:15 | #
Oui mais attention, ce n'est pas le même prototype. (Sinon à quel endroit la fonction de fxlib pourrait-elle se planter ?)
Citer : Posté le 26/04/2019 13:39 | #
Ah d'accord, merci!
Citer : Posté le 26/04/2019 14:06 | #
KhiCAS sur Graph 35+E II a fait son petit effet sur le stand Casio à l'Orme hier.
Citer : Posté le 26/04/2019 15:55 | #
Bon, j'ai fini par reussir a utiliser getkeywait, le code renvoye dans key ne sert a rien, mais le code de colonne et de ligne a l'air d'etre 1 et 1 pour AC.
Encore pas mal de boulot en perspective, je pense que la partie CAS est utilisable maintenant (meme si l'editeur 2d a encore des bugs et s'il manque encore des menus, en particulier VARS et CATALOG).
Ajouté le 26/04/2019 à 15:58 :
KhiCAS sur Graph 35+E II a fait son petit effet sur le stand Casio à l'Orme hier.
Je n'ai pas encore fait part de mes progres a Camille Margot, j'attendais que ce soit un peu plus robuste et aussi d'avoir la partie programmation, c'est super si vous l'avez montre la-bas!
Citer : Posté le 26/04/2019 16:08 | #
Je l'ai montré rapidement sur Graph 35+E II au directeur commercial qui avait fait le déplacement.
Niveau visiteurs il n'y avait pas grand monde d'intéressant sur les stands.
Les plus nombreux devaient être le matin les élèves de primaire, plusieurs enseignants ayant amené leur classe.
Sur le stand de TI, le robot TI-Innovator Rover qui faisait du park-assist a davantage retenu leur attention, certes...
Citer : Posté le 26/04/2019 21:58 | #
La persistance devrait fonctionner maintenant (console et variables, sauf pour la position justifiee a droite/gauche dans la console, mais c'est peut-etre pas plus mal comme ca on voit bien l'ancien et le nouveau). Ainsi que la gestion des modes (Python/Xcas et RAD/DEG) via shift-SETUP, avec affichage de l'etat (et de l'heure) juste au-dessus de la ligne de menu, ou il y a toujours de la place libre, sauf quand on edite une ligne de commande (et dans ce cas l'etat n'est pas affiche). Pour mettre a l'heure il faut faire time(hh,mm) (pour le moment en tout cas).
Ajouté le 27/04/2019 à 13:58 :
J'ai rajoute l'UI de la touche VARS, mais pas moyen de detourner CATALOG qui renvoie toujours sur le catalogue Casio, c'est normal? Du coup, j'utilise pour l'instant OPTN. Il faudra peut-etre que je mette une touche en F pour le catalogue quitte a deplacer un menu configurable (F4, en mettant plot en F6 et misc sur shift-X,theta,T),.
Citer : Posté le 27/04/2019 14:02 | #
Absolument, c'est intégré à la fonction GetKey(), comme la modification du contraste et le fait que Shift+OPTN allume le rétro-éclairage. Ce genre de raccourcis que tu ne peux pas contourner.
Citer : Posté le 28/04/2019 12:05 | #
Nouveau probleme, assez incomprehensible, en ajoutant l'editeur de script. Crash avec
ADDRESS(R)
TARGET=E6FF2136
PC=8804F800
Lorsque je commente une partie du code, le crash ne se produit pas. Si le code n'est pas commente, le crash se produit *apres* l'affichage du texte source du script (on voit le texte affiche en-dessous de System Error) mais avant d'avoir pu taper quoi que ce soit au clavier. Le code commente correspond a la gestion de certaines touches du clavier.
Ce qui est incomprehensible, c'est que GetKey(&key) n'est pas atteint avant le crash lorsque le code #if 0 ... #endif est decommente, c'est comme si le CPU savait a l'avance qu'il y avait cette portion de code apres GetKey et qu'il decidait de crasher.
...
unsigned int key;
GetKey(&key);
...
switch(key){
case KEY_CTRL_DEL:
if (clipline>=0){
giac::copy_clipboard(get_selection(text,true),true);
// erase selection
clipline=-1;
}
...
#if 0
case KEY_CTRL_EXE:
if(text->allowEXE) return TEXTAREA_RETURN_EXE;
if (search.size()){
for (;;){
if (!move_to_word(text,search,replace,isFirstDraw,totalTextY,scroll,textY))
break;
}
show_status(text,search,replace);
continue;
}
#endif
Il n'y a rien de particulier dans ce code pourtant.
Ajouté le 28/04/2019 à 14:05 :
J'avance un peu dans la localisation du crash, mais je ne vois toujours pas pourquoi ca crashe. Le crash se produit a la fin de l'appel a la fonction textarea_disp qui affiche le source du script, lorsque cette fonction est presente plus qu'une fois dans le code source. Peut-etre que si elle est presente une seule fois alors elle est inlinee par le linker (a cause de l'option -lflto), ce qui fait la difference. Son prototype est
void textarea_disp(textArea * text,int & isFirstDraw,int & totalTextY,int & scroll,int & textY);
Citer : Posté le 28/04/2019 16:04 | #
0xe6ff2136 est une adresse inutilisable donc elle est probablement fausse (m'étonnerait que tu ailles lire là-bas). Quant à 0x8804f800, c'est une adresse dans la deuxième moitié de la RAM, peut-être dans la pile ou dans le tas ; en tous cas pas du code, je doute que tu alloues dynamiquement du code ?
Ce genre d'erreur où ajouter du code semble causer des problèmes avant que le code en question soit exécuté... c'est bizarre, hein ? Ça m'est arrivé plusieurs fois et à chaque fois c'était un problème d'alignment ou de linker sur mes données ; ajouter du code décalait des choses dans la mémoire et causait un problème à cause du changement d'adresse.
Citer : Posté le 28/04/2019 16:32 | #
Je me demande si ce n'est pas la fonction textarea_disp qui aurait un bug avec des chaines C qui ecraserait une adresse de retour sur la pile, je cherche...
Ajouté le 28/04/2019 à 16:40 :
Bon, je ne sais pas si j'ai trouve, mais en allouant une chaine sur la pile au lieu du malloc/free qui etait a l'origine, ca ne crashe plus. Et c'est de toute facon bien mieux d'allouer sur la pile
Ajouté le 29/04/2019 à 18:26 :
Update avec l'editeur de script qui fonctionne a peu pres et les menus a peu pres finalises.
Comment fonctionne les touches CLIP et PASTE, on peut les capturer ? Ca n'a pas l'air du tout la meme chose que sur la 90.
Citer : Posté le 29/04/2019 18:27 | #
D'après la doc tu peux les capturer avec KEY_CTRL_CLIP et KEY_CTRL_PASTE. Je n'ai jamais essayé, cependant.