Merge branch 'write_repeat'
authorWalter Fetter Lages <w.fetter@ieee.org>
Fri, 2 Aug 2019 04:29:30 +0000 (01:29 -0300)
committerWalter Fetter Lages <w.fetter@ieee.org>
Fri, 2 Aug 2019 04:29:30 +0000 (01:29 -0300)
1  2 
lib/bno055_tty.c

@@@ -100,22 -101,23 +101,26 @@@ s8 BNO055_tty_write(u8 dev_addr,u8 reg_
        int n=0;
        int c=0;
  
-       tcflush(dev_addr,TCIOFLUSH);
-       array[0]=BNO055_UART_START;
-       array[1]=BNO055_UART_WRITE_CMD;
-       array[2]=reg_addr;
-       array[3]=cnt;
-       for (i=0;i < cnt;i++) array[i+4]=*(reg_data+i);
-       
-       for(n=0;n < cnt+4;n+=c)
+       do
        {
-               if((c=write(dev_addr,array+n,1))==-1) return BNO055_ERROR;
-               usleep(100);
-       }
+               tcflush(dev_addr,TCIOFLUSH);
+               array[0]=BNO055_UART_START;
+               array[1]=BNO055_UART_WRITE_CMD;
+               array[2]=reg_addr;
+               array[3]=cnt;
+               for (i=0;i < cnt;i++) array[i+4]=*(reg_data+i);
+       
+               for(n=0;n < cnt+4;n+=c)
 -                      if((c=write(dev_addr,array+n,cnt+4-n))==-1) return BNO055_ERROR;
++              {
++                      if((c=write(dev_addr,array+n,1))==-1) return BNO055_ERROR;
++                      usleep(100);    /* Necessary to avoid overrun? */
++              }
  
-       for(n=0;n < 2; n+=c)
-               if((c=read(dev_addr,array+n,2-n)) <= 0) return BNO055_ERROR;
+               for(n=0;n < 2; n+=c)
+                       if((c=read(dev_addr,array+n,2-n)) <= 0) return BNO055_ERROR;
  
+       } while(array[0] == BNO055_UART_ACK && array[1] == BNO055_UART_OVERRUN);
+       
        if(array[0] != BNO055_UART_ACK || array[1] != BNO055_UART_SUCCESS) return BNO055_ERROR;
  
        return BNO055_SUCCESS;
@@@ -128,20 -130,20 +133,23 @@@ s8 BNO055_tty_read(u8 dev_addr,u8 reg_a
        int length=0;
        int c=0;
  
-       tcflush(dev_addr,TCIOFLUSH);
-       array[0]=BNO055_UART_START;
-       array[1]=BNO055_UART_READ_CMD;
-       array[2]=reg_addr;
-       array[3]=cnt;
-       
-       for(n=0;n < 4;n+=c)
+       do
        {
-               if((c=write(dev_addr,array+n,1))==-1) return BNO055_ERROR;
-               usleep(100);
-       }
-       for(n=0;n < 2; n+=c)
-               if((c=read(dev_addr,array+n,2-n)) <= 0) return BNO055_ERROR;
+               tcflush(dev_addr,TCIOFLUSH);
+               array[0]=BNO055_UART_START;
+               array[1]=BNO055_UART_READ_CMD;
+               array[2]=reg_addr;
+               array[3]=cnt;
+       
+               for(n=0;n < 4;n+=c)
 -                      if((c=write(dev_addr,array+n,4-n))==-1) return BNO055_ERROR;
++              {
++                      if((c=write(dev_addr,array+n,1))==-1) return BNO055_ERROR;
++                      usleep(100);    /* Necessary to avoid overrun? */
++              }
+               for(n=0;n < 2; n+=c)
+                       if((c=read(dev_addr,array+n,2-n)) <= 0) return BNO055_ERROR;
+       } while(array[0] == BNO055_UART_ACK && array[1] == BNO055_UART_OVERRUN);
        
        switch(array[0])
        {