π
<-
Chat plein-écran
[^]

Ndless / nspireio UART Chat

C, C++, ASM...

Re: Ndless / nspireio UART Chat

Unread postby critor » 15 Oct 2017, 13:26

Adriweb wrote:et " "if(*inptr!=oldc) {" makes no sense "

Ben c'est un workaround temporaire pour ignorer les caractères successifs identiques. Sinon ça floode l'écran en une fraction de seconde et je n'ai pas le temps de lire le bootlog et donc pas la possibilité de comprendre le problème.

Pour le reste ok, dès que j'ai le temps je vais donc me faire ma propre fonction mygetchar() qui n'accusera pas réception avec putchar(), et on verra si ça permet de corriger le problème
sans casser autre chose
.
Image
User avatar
critorAdmin.
Niveau 18: DC (Deus ex Calculatorum)
Niveau 18: DC (Deus ex Calculatorum)
Level up: 98.1%
 
Posts: 33696
Images: 8790
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
Class: Lycée
YouTube: critor3000
Twitter: critor2000
Facebook: critor.ti

Re: Ndless / nspireio UART Chat

Unread postby Adriweb » 15 Oct 2017, 14:32

Je vois que le problème originel a été résolu via compu sur github : https://github.com/compujuckel/nspire-i ... -336710873 :)
User avatar
AdriwebAdmin.
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 51.7%
 
Posts: 12652
Images: 1081
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
Class: (ingénieur)
Twitter: adriweb
GitHub: adriweb

Re: Ndless / nspireio UART Chat

Unread postby TurtleForGaming » 15 Oct 2017, 14:43

Ok problemme regler (https://github.com/compujuckel/nspire-io/issues/6) mais maintenant quand j'envoie un message ver s la TI elle se bloque jusqu'a l'arrive d'un autre message quelqu'un a une idée pourquoi. Mon code maintenant:
Code: Select all
#include <os.h>
//#include <nspireio/nspireio.h>
#include <nspireio/uart.hpp>
#include <nspireio/console.hpp>

int key_already_pressed = 0;
char oldinput[100] = {0};
char voidlist[100] = {0};
int dispInput = 0;

char* uart_getsn_mdf(char* str, int num)
{
   int i;
   for(i = 0; i < num-1; i++)
   {
      char c = uart_getchar();
      str[i] = c;
      if(c == '\b')
      {
         //uart_puts(" \b");
         i -= 2;
      }
      else if(c == '\r')
      {
         str[i] = 0;
         //uart_putchar('\n');
         return str;
      }
   }
   str[num] = 0;
   return str;
}

int main(void)
{
   assert_ndless_rev(874);
   //clrscr();
   nio_console csl;
   nio_init(&csl,NIO_MAX_COLS,NIO_MAX_ROWS,0,0,NIO_COLOR_WHITE,NIO_COLOR_BLACK,TRUE);
   nio_set_default(&csl);
   nio_color(&csl,NIO_COLOR_BLACK,NIO_COLOR_WHITE);
   nio_printf("Nspire UART Chat by Samy. Compiled the %s At %s\n",__DATE__,__TIME__);
   nio_color(&csl,NIO_COLOR_WHITE,NIO_COLOR_BLACK);
   nio_puts("Press any ESC to exit and CTRL to send msg...\n");
   while(!isKeyPressed(KEY_NSPIRE_ESC)){
      if(isKeyPressed(KEY_NSPIRE_CTRL) && !key_already_pressed){
         nio_printf(">");
         char input2[100] = {0};
         nio_getsn(input2,100);
         uart_printf("\r\n");
         uart_printf(input2);
         key_already_pressed = 1;
      }
      if(!any_key_pressed())
         key_already_pressed = 0;
      if(uart_ready()) {
         char input[100] = {0};
         uart_getsn_mdf(input,100);
         nio_puts(input);
      }
   }
   nio_puts("Tests finished.");
   nio_free(&csl);   
   return 0;
}



et donc la partie uart de la lib:
Code: Select all
BOOL uart_ready(void)
{
   volatile unsigned *line_status_reg = IO(0x90020014,0x90020018);
   return is_classic ? *line_status_reg & 0b1 : !(*line_status_reg & 0b10000);
   //return is_classic ? *line_status_reg & 0b1 : !(*line_status_reg & 0b10);
}

char uart_getchar(void)
{
   volatile unsigned *recv_buffer_reg = (unsigned*)0x90020000;
   while(!uart_ready())
      idle();
   char tmp = *recv_buffer_reg;
   uart_putchar(tmp);
   return tmp;
}

char* uart_getsn(char* str, int num)
{
   int i;
   for(i = 0; i < num-1; i++)
   {
      char c = uart_getchar();
      str[i] = c;
      if(c == '\b')
      {
         uart_puts(" \b");
         i -= 2;
      }
      else if(c == '\r')
      {
         str[i] = 0;
         uart_putchar('\n');
         return str;
      }
   }
   str[num] = 0;
   return str;
}

char* uart_gets(char* str)
{
   return uart_getsn(str,50);
}

char uart_putchar(char character)
{
   volatile unsigned *line_status_reg = IO(0x90020014,0x90020018);
   volatile unsigned *xmit_holding_reg = (unsigned*)0x90020000;
   if(is_classic)
   {
      while(!(*line_status_reg & 0b100000)) // wait for empty xmit holding reg
         idle();
   }
   else
   {
      while(!(*line_status_reg & 0b10000000))
         idle();
   }
   *xmit_holding_reg = character;
    return character;
}

int uart_puts(const char *str)
{
   while(*str) {
      uart_putchar(*str++);
   }
    return 1;
}

void uart_printf(char *format, ...)
{
   char buf[256];
   memset(buf,'\0',256);
   va_list arglist;
   va_start(arglist,format);
   vsprintf(buf,format,arglist);
   uart_puts(buf);
   va_end(arglist);
}
User avatar
TurtleForGaming
Niveau 4: MC (Membre Confirmé)
Niveau 4: MC (Membre Confirmé)
Level up: 75%
 
Posts: 8
Joined: 01 Oct 2016, 11:47
Gender: Not specified
Calculator(s):
Class: Lycée 2°

Re: Ndless / nspireio UART Chat

Unread postby critor » 15 Oct 2017, 14:56

Je confirme que l'appel à uart_getchar est censé être bloquant en l'absence de données :
Code: Select all
char uart_getchar(void)
{
   volatile unsigned *recv_buffer_reg = (unsigned*)0x90020000;
   while(!uart_ready())
      idle();
   char tmp = *recv_buffer_reg;
   uart_putchar(tmp);
   return tmp;
}
Image
User avatar
critorAdmin.
Niveau 18: DC (Deus ex Calculatorum)
Niveau 18: DC (Deus ex Calculatorum)
Level up: 98.1%
 
Posts: 33696
Images: 8790
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
Class: Lycée
YouTube: critor3000
Twitter: critor2000
Facebook: critor.ti

Re: Ndless / nspireio UART Chat

Unread postby TurtleForGaming » 15 Oct 2017, 19:03

Ok probleme resolut j'ai modifier la lib pour que sa donne sa:
Code: Select all
char uart_getchar(void)
{
   volatile unsigned *recv_buffer_reg = (unsigned*)0x90020000;
   volatile unsigned *line_status_reg = IO(0x90020014,0x90020018);
   bool uartready = is_classic ? *line_status_reg & 0b1 : !(*line_status_reg & 0b10000);
   if(!uartready)
    {
      idle();
   } else {
      char tmp = *recv_buffer_reg;
      //uart_putchar(tmp);
      return tmp;
   }
}

Et en enlevant le fait que les Warning donnes des erreur de compilation et c'est bon cela fonctione.
User avatar
TurtleForGaming
Niveau 4: MC (Membre Confirmé)
Niveau 4: MC (Membre Confirmé)
Level up: 75%
 
Posts: 8
Joined: 01 Oct 2016, 11:47
Gender: Not specified
Calculator(s):
Class: Lycée 2°

Previous

Return to Native: Ndless, Linux, ...

Who is online

Users browsing this forum: No registered users and 1 guest

-
Search
-
Featured topics
Concours TI-Planet-Casio de rentrée 2019. 3 défis pour plus d'une 15aine de calculatrices graphiques et nombre de goodies sortant de l'ordinaire ! :D
Comparaisons des meilleurs prix pour acheter sa calculatrice !
12
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...

Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety 
-
Stats.
684 utilisateurs:
>625 invités
>53 membres
>6 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)