UD-GS1 デバグ用 3D Acc 動かない

Fork of UDNS1_mbed-dev by I-O DATA DEV2

main.cpp

Committer:
hakusan270
Date:
2018-09-24
Revision:
173:1198e6c31b4a
Parent:
172:3aa6f1366c5d

File content as of revision 173:1198e6c31b4a:

#include "mbed.h"
#include <string.h>
#include <time.h>
#include "rtc_api.h"
#include "watchdog.h"

#define ONE_G_ACCELERATION 9.8     //重力加速度
#define EXP_BIAS           12  
#define TTFloat_MIN   0.000245094f 
#define TTFloat_MAX   1046528.0f 
#define GRAV 9.8f
#define GRATE  413.0f 

SPI STSPI(SPI_MOSI, SPI_MISO, SPI_SCK);
DigitalOut STSPICS(PB_9);
Ticker      interrput;
Serial pc(PA_9, PA_10,115200 ); //console
Serial pclpwa(PB_10, PB_11,115200); 
DigitalOut myled(PB_14);
DigitalOut ext7(PB_15);

DigitalOut wkup(PA_5);
DigitalOut enabl(PA_6);
DigitalOut v20v(PA_12);
DigitalIn  intout1(PA_7,PullNone);
DigitalIn  intout2(PA_4,PullNone);
AnalogIn   batlev(PA_2);
InterruptIn event(PA_7);

Watchdog wd;

char buffer[100];
uint8_t rxbuffer[128];
uint8_t cmdrxbuffer[80];
uint8_t rxCmdStatus[128];
int rxindex=0;
int oldrxindex;
int cmdrxindex=0;
uint8_t rcvf;
uint8_t dbgmsgf=1;
uint8_t errorf;

void intTimer( void );   
int read3axes(short *tx,short *ty,short *tz);
float UDGS1_decodeFloat(unsigned short v);
unsigned short UDGS1_encodeFloat(float v);
int int_sqrt(unsigned int x);
int initLIS3DH();
int readTemp(short *tmp);

void rx_Irq(void)
{
    // read from the peripheral and make sure something is available
    uint8_t c;
    while(pclpwa.readable() ) {
       c = rxbuffer[rxindex] = pclpwa.getc();
       if (rxindex>127) {
               rxbuffer[rxindex+1]=0;
               if (dbgmsgf) pc.write((const uint8_t *)rxbuffer,rxindex,NULL);
               memcpy((char*)rxCmdStatus,(char*)rxbuffer , rxindex+1 );
               oldrxindex = rxindex+1;
               rxindex=0;
               rcvf=1;
               rxbuffer[rxindex+1]=0;
       } else
       if (/*c==0x0d ||*/ c==0x0a) {
            rxbuffer[rxindex+1]=0;
            if (dbgmsgf) pc.write((const uint8_t *)rxbuffer,rxindex+1,NULL);
            strcpy((char*)rxCmdStatus,(char*)rxbuffer );
            oldrxindex = rxindex+1;
            rxindex=0;
            rcvf=1;
            if (strstr((char*)rxbuffer,"Invalid")) errorf=1;
            if (strstr((char*)rxbuffer,"Busy")) errorf=2;
            
       } else rxindex++;
    }

    return;
}

int SendLPWAcmd(char *cmd)
{
    int timeout=30;
    int i=0;
    rcvf=0;
    errorf=0;
    
    wait_ms(1);    
    while(rxindex && timeout--)wait_ms(10);
    if(timeout==0)pc.printf("timeout 1\n\r");
    memset(rxbuffer,0,sizeof(rxbuffer));
    rxindex=0;
    
    wait_ms(10);
    pclpwa.printf(cmd);
    pclpwa.printf("\r\n");
    timeout=500;
    while (rcvf==0 && timeout--) wait_ms(10);
    if(timeout==0)pc.printf("timeout 2\n\r");
    if (errorf) {
         timeout=500;
        //retry
        wait_ms(10);
        rcvf=0;
        errorf=0;
        wait_ms(10);
        pclpwa.printf(cmd);
        pclpwa.printf("\r\n");
        while (rcvf==0 && timeout--) wait_ms(10);
        if(timeout==0)pc.printf("timeout 3\n\r");
    }
    wait_ms(10);    
    return errorf;
}



void cmd_rx_Irq(void)
{
    // read from the peripheral and make sure something is available
    uint8_t c;
    while(pc.readable() ) {
       c = cmdrxbuffer[cmdrxindex] = pc.getc();
       pc.putc(c);
       if (cmdrxindex>80) {
               pclpwa.write((const uint8_t *)cmdrxbuffer,cmdrxindex,NULL);
               cmdrxindex=0;
       } else cmdrxindex++;
       if (c==0x0d || c==0x0a) {
            pclpwa.write((const uint8_t *)cmdrxbuffer,cmdrxindex,NULL);
            pclpwa.printf("\r\n");
            cmdrxindex=0;
       } else cmdrxindex++;
    }
    return;
}
void intpin1()
{
 pc.printf("@@@@@@@@ INTout1 @@@\n\r");   
}

float convertLaloFomMin(float lalo)
{
    int integ;
    float min;
    integ = (int)lalo;
    min = lalo - (float)integ;
    min = min / 0.60 ;
    return((float)integ + min);   
}
/*  緯度 24 - 46 */
long convertLaInt(float la)
{
   return( (int)((convertLaloFomMin(la) - 24.0f ) / 0.00001049042 ) ); 
}

/*  経度 122 - 146*/

long convertLoInt(float lo)
{
   return( (int)((convertLaloFomMin(lo) - 122.0f ) / 0.000011444095 ) ); 
}    

/*  緯度 24 - 46 */
float convertLaFloat(int la)
{
   return( 24.0f + 0.00001049042 * (float)la ); 
}

/*  経度 122 - 146*/

float convertLoFloat(int lo)
{
   return( 122.0f + 0.000011444095 * (float)lo  ); 
}    


int getNextTimeSet()
{
    int mode=0;
    char *p;
    dbgmsgf=0; 
    memset((char*)rxCmdStatus,0,sizeof(rxCmdStatus)); 
    SendLPWAcmd("< TIME DREM GET");
//    pc.printf((char*)rxCmdStatus);
    p = strstr((char*)rxCmdStatus,"TIME DREM GET");
    if (p) {
//        pc.printf(p+13);
        sscanf(p + 14,"%d",&mode);            
    }   
    dbgmsgf=1;  
    return(mode);
}

int getNextTimeSend()
{
    int mode=0;
    char *p;
    dbgmsgf=0; 
    memset((char*)rxCmdStatus,0,sizeof(rxCmdStatus)); 
    SendLPWAcmd("< TIME TREM GET");
//    pc.printf((char*)rxCmdStatus);
    p = strstr((char*)rxCmdStatus,"TIME TREM GET");
    if (p) {
//        pc.printf(p+13);
        sscanf(p + 14,"%d",&mode);            
    }   
    dbgmsgf=1;  
    return(mode);
}

int setPayload(char *payload) {
   char buf[60]= {"< TX PLD SET "};
   char dat[8];
   int i;  
   int ret; 
   for(i=0;i<16;i++){
        sprintf(dat,"%02x",payload[i] & 0xff);
        strcat(buf,dat); 
   } 
 // pc.printf(buf);    
   ret = SendLPWAcmd(buf);
   if (ret==0) {
       if (strstr((char*)rxbuffer,"> TX PLD SET")==NULL) ret= -1;
  }
  return(ret);
}

int getGNSSmode()
{
    int mode=0;
    char *p;
    dbgmsgf=0; 
    memset((char*)rxCmdStatus,0,sizeof(rxCmdStatus)); 
    SendLPWAcmd("< GNSS STT GET");
//    pc.printf((char*)rxCmdStatus);
    p = strstr((char*)rxCmdStatus,"GNSS STT GET");
    if (p) {
//        pc.printf(p+13);
        sscanf(p + 13,"%x",&mode);            
    }   
    dbgmsgf=1;  
    return(mode);
}

int getGPStime(time_t *gpst)
{
    int timeout=10;
    dbgmsgf=0;  
    int   ret=0;
    char  *p;
    memset((char*)rxCmdStatus,0,sizeof(rxCmdStatus));
    SendLPWAcmd("< TIME CTIME GET");
    while(timeout--) {
       wait_ms(500);
       p = strstr((char*)rxCmdStatus,"TIME CTIME");
       if (p) break;
    }
    wait_ms(1);
     p = strstr((char*)rxCmdStatus,"0x");
    if (p) {
        sscanf(p,"%x",(int*)gpst);
        ret=1;
    }
    dbgmsgf=1;  
    return(ret);
}


int getTimeFromGPS(char *buf, int rtcset){
    time_t gpstime;
    time_t tim;
    int ret;
    struct tm *now;
    if ( getGPStime(&gpstime) ) {
       int gpsw, gpstw;
        gpsw = gpstime >> 20;
        gpstw = gpstime & 0xfffff;
        tim = (gpsw * 7 * 24 * 60 * 60) + gpstw;
        tim += (10*365*24*60*60 + 24*60*60*7 + 9*60*60);//Tokyo time
        now = localtime(&tim);
        if (rtcset) rtc_write(tim);
        
         ret = strftime(buf, 23,"%Y %m/%d %T",now);
        return(ret);
    }
    return -1;
}



int getGPSposGGA(float *pLo,float *pLa, float *pHDOP, long *pElev)
{
    int timeout=10;
    int i,j;
    dbgmsgf=0;  
    int ret=0;
    int sum=0;
    memset((char*)rxCmdStatus,0,sizeof(rxCmdStatus));
    SendLPWAcmd("< GNSS HOST_FW_SENT SET_EVT 0x0001");
    while(timeout--) {
       wait_ms(500);
       if (strstr((char*)rxCmdStatus,"$GPGGA") ) break;
    }
    wait_ms(1);
    if (timeout) {
      for(i=0,j=0;i<128;i++) {
        if (rxCmdStatus[i]== ',' ) {
            j++;
            if (j==2 && rxCmdStatus[i+2]!=',') sscanf((char*)rxCmdStatus+i+1, "%f",pLo );
            else if (j==4 && rxCmdStatus[i+2]!=',') sscanf((char*)rxCmdStatus+i+1, "%f",pLa );
            else if (j==8 && rxCmdStatus[i+2]!=',') sscanf((char*)rxCmdStatus+i+1, "%f",pHDOP );
            else if (j==9 && rxCmdStatus[i+2]!=',') sscanf((char*)rxCmdStatus+i+1, "%d",pElev );
            ret=1;
        } else if (rxCmdStatus[i]== '*' ) {
             sscanf((char*)rxCmdStatus+i+1, "%x",&sum );
             int x;
              uint8_t s = 0;
             for(x=3;rxCmdStatus[x]!='*';x++) s ^= rxCmdStatus[x];
             s &= 0xff;
           //  pc.printf("%s %02x, %02x %d\r\n",rxCmdStatus,sum,s & 0xff,sum);
           if (s != sum){
                ret = -1;// check sum err
                pc.printf("sum-err %s %02x, %02x \r\n",rxCmdStatus,sum,s & 0xff);
           }
         }
    }
    
     SendLPWAcmd("< GNSS HOST_FW_SENT SET_EVT 0x0000");
    }
    dbgmsgf=1;  
     return(ret);
}


int getGPSGSA(int *pmode,float *pPDOP)
{
    int timeout=10;
    int i,j;
    dbgmsgf=0;  
    int ret=0;
    int sum=0;
    memset((char*)rxCmdStatus,0,sizeof(rxCmdStatus));
    SendLPWAcmd("< GNSS HOST_FW_SENT SET_EVT 0x0004");
    while(timeout--) {
       wait_ms(500);
       if (strstr((char*)rxCmdStatus,"GSA") ) break;
    }
    wait_ms(1);
    if (timeout) {
      for(i=0,j=0;i<128;i++) {
        if (rxCmdStatus[i]== ',' ) {
            j++;
            if (j==2 && rxCmdStatus[i+2]!=',') sscanf((char*)rxCmdStatus+i+1, "%d",pmode );
            else if (j==16 && rxCmdStatus[i+2]!=',') sscanf((char*)rxCmdStatus+i+1, "%f",pPDOP );
            ret=1;
        } else if (rxCmdStatus[i]== '*' ) {
             sscanf((char*)rxCmdStatus+i+1, "%x",&sum );
             int x;
              uint8_t s = 0;
             for(x=3;rxCmdStatus[x]!='*';x++) s ^= rxCmdStatus[x];
             s &= 0xff;
           //  pc.printf("%s %02x, %02x %d\r\n",rxCmdStatus,sum,s & 0xff,sum);
           if (s != sum){
                ret = -1;// check sum err
                pc.printf("sum-err %s %02x, %02x \r\n",rxCmdStatus,sum,s & 0xff);
           }
         }
    }
    
     SendLPWAcmd("< GNSS HOST_FW_SENT SET_EVT 0x0000");
    }
    dbgmsgf=1;  
     return(ret);
}



int getGPSRMC(char *ptime,char *pdate,float *pLo,float *pLa)
{
    int timeout=10;
    int i,j;
    dbgmsgf=0;  
    int ret=0;
    int sum=0;
    memset((char*)rxCmdStatus,0,sizeof(rxCmdStatus));
    SendLPWAcmd("< GNSS HOST_FW_SENT SET_EVT 0x0020");
    while(timeout--) {
       wait_ms(500);
       if (strstr((char*)rxCmdStatus,"RMC") ) break;
    }
    wait_ms(1);
    if (timeout) {
      for(i=0,j=0;i<128;i++) {
        if (rxCmdStatus[i]== ',' ) {
            j++;
            if (j==1) memcpy(ptime,(char*)rxCmdStatus+i+1,9 );
            else if (j==9) memcpy(pdate,(char*)rxCmdStatus+i+1,6 );
            else if (j==3 && rxCmdStatus[i+2]!=',') sscanf((char*)rxCmdStatus+i+1, "%f",pLo );
            else if (j==5 && rxCmdStatus[i+2]!=',') sscanf((char*)rxCmdStatus+i+1, "%f",pLa );
            ret=1;
        } else if (rxCmdStatus[i]== '*' ) {
             sscanf((char*)rxCmdStatus+i+1, "%x",&sum );
             int x;
              uint8_t s = 0;
             for(x=3;rxCmdStatus[x]!='*';x++) s ^= rxCmdStatus[x];
             s &= 0xff;
           //  pc.printf("%s %02x, %02x %d\r\n",rxCmdStatus,sum,s & 0xff,sum);
           if (s != sum){
                ret = -1;// check sum err
                pc.printf("sum-err %s %02x, %02x \r\n",rxCmdStatus,sum,s & 0xff);
           }
         }
    }
    
     SendLPWAcmd("< GNSS HOST_FW_SENT SET_EVT 0x0000");
    }
    dbgmsgf=1;  
     return(ret);
}



int main()
{
       int i=0;
       short  x,y,z;
       char c;
       int ret;
       int rtcenb=0;
        rtc_init();
        printf("\r\n**** Hello UD-GS1 by mbed ******\r\n");
        
        long llo = convertLoInt(136.599999f);
        float flo =  convertLoFloat(llo);
        long lla = convertLaInt(36.599999f);
        float fla = convertLaFloat(lla);
        pc.printf("lo=%f %08x la=%f %08x\r\n", flo,llo,fla,lla);         
        llo = convertLoInt(146.0f);
        flo =  convertLoFloat(llo);
        lla = convertLaInt(46.0f);
        fla = convertLaFloat(lla);
        pc.printf("lo=%f %08x la=%f %08x\r\n", flo,llo,fla,lla);         
        
        
        if (wd.WatchdogCausedReset())
            pc.printf("Watchdog caused reset.\r\n");
        wd.Configure(30); 
        wd.Service(); 
  //     enabl.mode(PullNone);
  //     wkup.mode(PullNone);
  //     v20v.mode(PullNone);
  // ext7.mode(PullNone);
       dbgmsgf=1;  
       enabl = 0;
       wkup =  1;    // Normal mode
       v20v =  1;   //2V off   
       wait_ms(100);    
       enabl = 1;  // enable
       v20v =  0;   //2V ON   
       while(pclpwa.readable()) c = pclpwa.getc();       
       pclpwa.attach(rx_Irq,Serial::RxIrq); 
       pclpwa.set_flow_control(Serial::RTSCTS,PB_1,PB_13); 
       wait_ms(500);  // 4sec 
       printf("\r\n**** LPWA ON  ******\r\n");
       
       event.rise (&intpin1);
       event.enable_irq();
       pc.printf("Adc=%d INT1=%d INT2=%d ",(int)(batlev.read()*100.0f) , intout1.read(),intout2.read());
       initLIS3DH();
       read3axes(&x,&y,&z);
       printf("3D acc x=%d y=%d z=%d Temp=%d\r\n",x,y,z,readTemp(NULL));
//        interrput.attach(&intTimer, 0.001);
#if 0       
 SendLPWAcmd("< SYS MODE SET 05");
 SendLPWAcmd("< SYS EEPROM GET 0x0410");
 SendLPWAcmd("< SYS EEPROM GET 0x0414");
 wait(0.1);  // 100 ms
 SendLPWAcmd("< SYS EEPROM SET 0x0410,0x00000001");
 SendLPWAcmd("< SYS EEPROM SET 0x0414,0x00000010");
 wait(0.1);  // 100 ms
 SendLPWAcmd("< SYS EEPROM GET 0x0410");
 SendLPWAcmd("< SYS EEPROM GET 0x0414");
 while(1);       
#endif       
       dbgmsgf=0;  
       ret = SendLPWAcmd("< SYS MODE SET 00");
       if (ret==0) pc.write((const uint8_t *)rxbuffer,oldrxindex+1,NULL);
//       SendLPWAcmd("< SYS MODE SET_EVT ON");
       ret = SendLPWAcmd("< SYS VER GET");
       if (ret==0) pc.write((const uint8_t *)rxbuffer,oldrxindex+1,NULL);
//       wait_ms(100);    
       ret = SendLPWAcmd("< GNSS VER GET");
       if (ret==0) pc.write((const uint8_t *)rxbuffer,oldrxindex+1,NULL);
//       wait_ms(100);    
       ret = SendLPWAcmd("< SYS MODE SET 00");
       if (ret==0) pc.write((const uint8_t *)rxbuffer,oldrxindex+1,NULL);
//       SendLPWAcmd("< SYS TO_WAIT_FETCHING SET ON");
       ret = SendLPWAcmd("< SYS TO_FETCHING SET ON");
       if (ret==0) pc.write((const uint8_t *)rxbuffer,oldrxindex+1,NULL);
       ret = SendLPWAcmd("< TX PLD SET 0123456789ABCDEF0123456789ABCDEF");
       if (ret==0) pc.write((const uint8_t *)rxbuffer,oldrxindex+1,NULL);
//       SendLPWAcmd("< GNSS HOST_FW_SENT SET_EVT 0x0001");
       ret = SendLPWAcmd("< TX PREV_STT SET_EVT ON");
       if (ret==0) pc.write((const uint8_t *)rxbuffer,oldrxindex+1,NULL);
       ret = SendLPWAcmd("< GNSS STT GET");
       if (ret==0) pc.write((const uint8_t *)rxbuffer,oldrxindex+1,NULL);
        char pay[16]={0x00, 0x01, 0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x10,0x20,0x30,0x40,0x50,0x60,0x70};
        setPayload(pay);
       if (ret==0) pc.write((const uint8_t *)rxbuffer,oldrxindex+1,NULL);
       else pc.printf("Set payload error\r\n");

       dbgmsgf=1;  

       wd.Configure(20.0f); 

       while (1) {
          int mode;
          float lo=0.0f,la=0.0f,HDOP;
          long elev;
          wd.Service(); 

          
          // printf(" cnt=%d   stat= ",i++);
           //SendLPWAcmd("< GNSS STT GET");
           mode = getGNSSmode();
           if (mode & 2  && rtcenb==0 ) {
               char st[32];
               if (getTimeFromGPS(st,1)>0) {
                    pc.printf("%s ",st );
            
                   rtcenb=1;
               }
           }
           pc.printf("Adc=%d INT1=%d INT2=%d mode=%02x  next time=%d\r\n",(int)(batlev.read()*100.0f) , intout1.read(),intout2.read(), mode ,getNextTimeSet());
           if (mode & 4) {
               char stime[10]={0};
               char sdate[8]={0};
               if (getGPSposGGA( &lo , &la, &HDOP,&elev) >= 0) {
                   pc.printf("Lo=N %f La=E %f HDOP=%f  evevation=%d\r\n", lo/100.0f,la/100.0f,HDOP,elev); 
               }
               
                if ( getGPSGSA(&mode,&HDOP) >= 0)
                   pc.printf("GSA 2D/3D mode=%d PDOP=%f\r\n", mode,HDOP); 

                if (getGPSRMC(stime,sdate,&lo , &la) >=0) 
                   pc.printf("RMC Lo=N %f La=E %f time %s date=%s\r\n", lo/100.0f,la/100.0f,stime,sdate); 
               
           }
           if (mode &0x80)    
               pc.printf("next time=%d  send=%d ",getNextTimeSet(), getNextTimeSend());
if (rtcenb)
{
           time_t tim = rtc_read();
           struct tm *now;
           char buf[24]={0};
           now = localtime(&tim);
           strftime(buf, 23,"%Y %m/%d %T",now);
           pc.printf("RTC time=%s\n\r",buf);
}
           pc.printf("Temp =%d ",readTemp(NULL));


           
           wait_ms(4000);
     //  pc.write((const uint8_t *)"ACBD\r\n",6,NULL);
     //  pc.puts("ASDFGREWA\r\n");
       //printf("PC12345ABCD cnt=%d\n\r",i++);
//         pclpwa.printf("< SYS VER GET\r\n");
//       read3axes(&x,&y,&z);
//       printf("3D acc x=%d y=%d z=%d\r\n",x,y,z);
    }
}





/*************************************************
  Read a regster from SPI
*************************************************/
unsigned char spireadReg(unsigned char ad){
    unsigned char r;
    STSPICS = 0;
    wait_us(1);
    STSPI.write(ad | 0x80);  
    r = STSPI.write(0);
    wait_us(1);
    STSPICS = 1;
    return(r);
}

/*************************************************
  Read multi regsters from SPI
*************************************************/
unsigned char spireadRegs(unsigned char ad,unsigned char *p,int bytes){
#if 0
   while(bytes--) {
      *p = spireadReg( ad );
      p++;
      ad++;
   }    
#else   
   STSPICS=0;
    wait_us(1);
    STSPI.write(ad | 0x80 );  
   while(bytes--) {
      *p++ = STSPI.write(0);
   }
   wait_us(1);
   STSPICS=1;
#endif  
    return(0);
}

/*************************************************
  Write a regster via SPI
*************************************************/
unsigned char spiwriteReg(unsigned char ad,unsigned char val){
    unsigned char r;
    STSPICS=0;
    wait_us(1);
    STSPI.write(ad);  
    r = STSPI.write(val);
    wait_us(1);
    STSPICS=1;
    return(r);
}


/****************************************
  half float 16bit浮動小数点からfloatに変換
  SEEEEE TT TTTT TTTT  --> SEEEEEEEE E TTT TTTT TTTT TTTT TTTT
  signed ext 
  float 指数部 bias 127
  half  指数部 bias 15
*****************************************/
float UDGS1_16decodeFloat(unsigned short v){
    volatile float r;
    int sign = 1;
    if (v & 0x8000) { sign = -1; v&= 0x7fff;}

    if(v==0) return(0.0f);
    if((v & 0x7c00) == 0 ) 
        *(unsigned long *)&r = ((v & 0x3ff) << (23-10));
    else 
        *(unsigned long *)&r = ((v & 0x3ff) << (23-10)) | (((v>>10) + (127-15)) << 23) ;  
    return(r * sign);
}

/****************************************
  float から half 16bit浮動小数点に変換
  SEEEEE TT TTTT TTTT  <-- SEEEEEEEE E TTT TTTT TTTT TTTT TTTT
  float 指数部 bias 127
  half  指数部 bias 15
*****************************************/
unsigned short UDGS1_16encodeFloat(float v){
    unsigned short sign = 0;
    if (v < 0.0f) sign = 0x8000;
  
    register unsigned long tf;
    register unsigned short exp;
    if(v <= 0.000000059f)return(0);
    if(v > 131008.0f)return(0x7fff);
    tf = *(unsigned long *)&v;
    exp = ((tf >> 23) & 0xff ) - (127-15);
    return( ((tf >> 13) & 0x3ff) | (exp << 10) | sign );
}


/****************************************
  tyny 13bit浮動小数点からfloatに変換
*****************************************/
float UDGS1_decodeFloat(unsigned short v){
    volatile float r;
    if(v==0) return(0.0f);
    *(unsigned long *)&r = ((v & 0xff) << (23-8)) | (((v>>8) + 115) << 23) ;  
    return(r);
}

/****************************************
  float から tiny 13bit浮動小数点に変換
*****************************************/
unsigned short UDGS1_encodeFloat(float v){
  
    register unsigned long tf;
    register unsigned short exp;
    if(v <= 0.0000235f)return(0);
    if(v > 1046528.0f)return(0x1fff);
    tf = *(unsigned long *)&v;
    exp = ((tf >> 23) & 0xff ) - (127-EXP_BIAS);
    return( ((tf >> 15) & 0xff) | (exp << 8) );
  
}

/***************************
  integer sqrt
    整数 sqrt
****************************/
int int_sqrt(unsigned int x)
{
  register int a = 0, c = 0, y = 0, i = 0, t = x;
  while(t >>= 1){
    ++i;
  }
  for(i += i & 1; i >= 0; i -= 2){
    c = (y << 1 | 1) <= x >> i;
    a = a << 1 | c;
    y = y << 1 | c;
    x -= c * y << i;
    y += c;
  }
  return a;
}



/*****************************************
  init LIS3DH ST micro 3-axes accelerometer
   SPI interface 
*****************************************/
int initLIS3DH()
{
//    STSPI = new SPI(SPI_MOSI, SPI_MISO, SPI_SCK, D6);
   
    STSPI.format(8,3);
    STSPI.frequency(1000000);
    STSPICS=1;
    wait_us(1);
    printf("Who am I %02x\r\n", spireadReg(0x0f));
    spiwriteReg(0x20,0x27);  
    spiwriteReg(0x23,0x98);  
    return (spireadReg(0x0f)== 0x44);
}

/*************************************************
  read 3-axes from LIS3DH
*************************************************/
int read3axes(short *tx,short *ty,short *tz)
{
    int timeout=5;
    unsigned char regs[6];
   
    while((spireadReg(0x07)&7)==0 && timeout--){wait_us(5);};
    spireadRegs(0x28,regs,6);// 12bit signed   1G = 413 9.8m/s**2
//    STSPI.frequency(); //1MHz
    *tx = (short)(regs[0] | (regs[1]<<8)) >> 4;
    *ty = (short)(regs[2] | (regs[3]<<8)) >> 4;
    *tz = (short)(regs[4] | (regs[5]<<8)) >> 4;
    return(0);
}

/*************************************************
  read temparature from LIS3DH
*************************************************/
int readTemp(short *tmp)
{
    int t;
    t = spireadReg(0x0d);
    t |=  spireadReg(0x0e) << 8;
    t >>= 4;
//    pc.printf("tmp %d %04x\r\n", t, t);
    if (tmp) *tmp = t;
    return(t);
}