So for around 2month now I'm developping an bluetooth interface (via UART) to the TI-Nspire. For that I use ndless and nspire-io (a bit modified to not lock the calc while waiting for message and echo remove). But for the past day I'm encoutering a little problem: when i send a message to the calc (with or without bluetooth) I only get 32chars for exemple if I send:
Quote%%|NUMS|10|TestA|TestB|TestC|TestD|TestE|TestF|TestG|TestH|TestI|TestJ
I will only get
Quote%%|NUMS|10|TestA|TestB|TestC|Tes
which is a big problem for me and I don't really know why it append.
Here is my code:
#include <os.h>
#include <nspireio/uart.hpp>
#include <nspireio/console.hpp>
int key_already_pressed_ctrl = 0;
int key_already_pressed_contact = 0;
char* contact = "%%|NUMS|6|Name1|Name2|Name3|Name4|Name6|Name7";
int hasSelectedContact = 0;
// Modidification of the uart_getsn() function to remove the echo.
char* uart_getsn_mdf(char* str, int num) {
for(int i = 0; i < num-1; i++){
if(uart_ready()) {
char c = uart_getchar();
str[i] = c;
if(c == '\b'){ i -= 2; }
else if(c == '\r') { str[i] =0; return str; }
}
}
str[num] = 0;
return str;
}
char* uart_gets_mdf(char* str)
{
return uart_getsn_mdf(str,50);
}
int numberOfCharsInArray(char* array) {
return strlen(array);
}
int main(void)
{
//Write the program title
assert_ndless_rev(874);
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. ");
nio_printf(" Compiled the %s At %s ",__DATE__,__TIME__);
nio_color(&csl,NIO_COLOR_BLACK,NIO_COLOR_LIGHTRED);
nio_printf(" Press ESC key to exit and CTRL to send msg. ");
nio_printf(" ");
nio_color(&csl,NIO_COLOR_WHITE,NIO_COLOR_BLACK);
nio_puts("");
//Send that we are online
uart_printf("#$#CALC:ENTERING:SMS\r\n");
//Main loop
while(!isKeyPressed(KEY_NSPIRE_ESC)){
if(isKeyPressed(KEY_NSPIRE_CTRL) && !key_already_pressed_ctrl && !key_already_pressed_contact){
if(hasSelectedContact) {
nio_printf("<< ");
char output[90] = {0};
nio_getsn(output,90);
uart_printf("$#$SMS:");
int num = numberOfCharsInArray(output);
for(char* it = output; *it; ++it) {
uart_printf("%c",*it);
sleep(100);
}
uart_printf("\r\n");
} else {
nio_printf("You must select an contact !\r\n");
}
key_already_pressed_ctrl = 1;
}
if(isKeyPressed(KEY_NSPIRE_C) && !key_already_pressed_contact && !key_already_pressed_ctrl){
// START Contact select part
nio_clear(&csl);
//Title
nio_color(&csl,NIO_COLOR_BLACK,NIO_COLOR_WHITE);
nio_printf(" Contact ");
nio_color(&csl,NIO_COLOR_WHITE,NIO_COLOR_BLACK);
//Search
nio_printf("Name search: ");
char output[90] = {0};
nio_getsn(output,90);
uart_printf("$#$UPDATENUM:%s\r\n",output);
nio_color(&csl,NIO_COLOR_BLACK,NIO_COLOR_WHITE);
nio_clear(&csl);
while(!uart_ready() && !isKeyPressed(KEY_NSPIRE_ESC)) {
nio_printf(" Waiting ");
sleep(500);
}
nio_color(&csl,NIO_COLOR_BLACK,NIO_COLOR_WHITE);
nio_printf(" Contact ");
nio_color(&csl,NIO_COLOR_WHITE,NIO_COLOR_BLACK);
nio_clear(&csl);
char input[1024] = {0};
//sleep(500);
uart_getsn_mdf(input,1024);
nio_puts(input);
nio_puts("Select your contact:");
contact = input;
char* namestable[1024];
char* s;
int i=0;
s = strtok(contact ,"|");
while (s != NULL) {
if(i>1) {
namestable[i] = s;
}
if(i>2) {
nio_printf(" %i) %s. \r\n",i-3,s);
}
s = strtok (NULL, "|");
i++;
}
nio_printf("Change contact to (n)?");
char selected[10] = {0};
nio_getsn(selected,10);
int ii = atoi(selected);
ii=ii+3;
if(ii >= 0 && namestable[ii] != "None") {
nio_printf("Changing send contact to %s. \r\n",namestable[ii]);
uart_printf("$#$CHANGENUM:%s\r\n",namestable[ii]);
hasSelectedContact = 1;
nio_clear(&csl);
nio_color(&csl,NIO_COLOR_BLACK,NIO_COLOR_WHITE);
// Display reponsive title
nio_printf(" Info: Now chating with: %s \r\n", namestable[ii]);
nio_printf(" ");
nio_puts("");
} else {
hasSelectedContact = 0;
nio_clear(&csl);
nio_color(&csl,NIO_COLOR_BLACK,NIO_COLOR_LIGHTRED);
nio_printf(" ");
nio_printf(" Error: Error while selecting contact please retry. ");
nio_printf(" If the error persist contact samy :) ");
nio_printf(" ");
nio_color(&csl,NIO_COLOR_WHITE,NIO_COLOR_BLACK);
nio_puts("");
}
nio_color(&csl,NIO_COLOR_WHITE,NIO_COLOR_BLACK);
// END Contact select part
key_already_pressed_contact = 1;
}
if(!any_key_pressed()) {
key_already_pressed_ctrl = 0;
key_already_pressed_contact = 0;
}
if(uart_ready()) {
sleep(500);
char input[1024] = {0};
uart_gets_mdf(input);
contact = input;
nio_printf("%s\r\n",input);
nio_printf("%s",input);
nio_puts("");
}
}
//Send that we are offline
uart_printf("#$#CALC:LEAVING:SMS\r\n");
//Exiting
nio_puts("Offline message sended. Exiting ...");
nio_free(&csl);
return 0;
}
For those who doesn't want to understand all of my code here is the part where I get my messages:
if(uart_ready()) {
sleep(500);
char input[1024] = {0};
uart_gets_mdf(input);
nio_printf("%s",input);
nio_puts("");
}
And here are the modified function:
char* uart_getsn_mdf(char* str, int num) {
for(int i = 0; i < num-1; i++){
if(uart_ready()) {
char c = uart_getchar();
str[i] = c;
if(c == '\b'){ i -= 2; }
else if(c == '\r') { str[i] =0; return str; }
}
}
str[num] = 0;
return str;
}
char* uart_gets_mdf(char* str)
{
return uart_getsn_mdf(str,50);
}
If somebody wanna help me I'm taking it.
PS: I'm french so sorry for mistakes