Page 2 sur 2

Re: Ndless / nspireio UART Chat

Message non luPosté: 15 Oct 2017, 13:26
de critor
Adriweb a écrit: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.

Re: Ndless / nspireio UART Chat

Message non luPosté: 15 Oct 2017, 14:32
de Adriweb
Je vois que le problème originel a été résolu via compu sur github : https://github.com/compujuckel/nspire-i ... -336710873 :)

Re: Ndless / nspireio UART Chat

Message non luPosté: 15 Oct 2017, 14:43
de TheStaticTurtle
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: Tout sélectionner
#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: Tout sélectionner
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);
}

Re: Ndless / nspireio UART Chat

Message non luPosté: 15 Oct 2017, 14:56
de critor
Je confirme que l'appel à uart_getchar est censé être bloquant en l'absence de données :
Code: Tout sélectionner
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;
}

Re: Ndless / nspireio UART Chat

Message non luPosté: 15 Oct 2017, 19:03
de TheStaticTurtle
Ok probleme resolut j'ai modifier la lib pour que sa donne sa:
Code: Tout sélectionner
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.