Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed SDFileSystem_
main.cpp@22:3d961e5a00a4, 2021-09-03 (annotated)
- Committer:
- tnanbu
- Date:
- Fri Sep 03 09:40:44 2021 +0000
- Revision:
- 22:3d961e5a00a4
- Parent:
- 21:6ce20b05602a
- Child:
- 23:83688f161631
y+100
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hakusan270 | 0:b76e4ba14765 | 1 | #include "mbed.h" |
rgoto | 6:bf4321ef0330 | 2 | #include "SDFileSystem.h" |
tnanbu | 8:7f80139df48d | 3 | #include <time.h> |
tnanbu | 8:7f80139df48d | 4 | |
hakusan270 | 0:b76e4ba14765 | 5 | /* |
hakusan270 | 0:b76e4ba14765 | 6 | This basic example just shows how to read the ADC internal channels raw values. |
hakusan270 | 0:b76e4ba14765 | 7 | Please look in the corresponding device reference manual for a complete |
hakusan270 | 0:b76e4ba14765 | 8 | description of how to make a temperature sensor, VBat or Vref measurement. |
hakusan270 | 0:b76e4ba14765 | 9 | */ |
hakusan270 | 0:b76e4ba14765 | 10 | |
hakusan270 | 0:b76e4ba14765 | 11 | AnalogIn adc_temp(ADC_TEMP); |
hakusan270 | 0:b76e4ba14765 | 12 | AnalogIn adc_vref(ADC_VREF); |
tnanbu | 11:2d5fcf102778 | 13 | /* UD-GS2 H/W define |
tnanbu | 11:2d5fcf102778 | 14 | PIO_SWin PB_4 |
tnanbu | 11:2d5fcf102778 | 15 | PIO_wkup PA_4 |
hakusan270 | 0:b76e4ba14765 | 16 | PIO_enable PB_0 |
hakusan270 | 0:b76e4ba14765 | 17 | PIO_intout1 PB_2 |
hakusan270 | 0:b76e4ba14765 | 18 | PIO_led PB_5 |
hakusan270 | 0:b76e4ba14765 | 19 | PIO_v20v PC_13 |
hakusan270 | 0:b76e4ba14765 | 20 | PIO_v18v PH_0 |
hakusan270 | 0:b76e4ba14765 | 21 | PIO_intout2 PH_1 |
hakusan270 | 0:b76e4ba14765 | 22 | PIO_spics PB_12 |
hakusan270 | 0:b76e4ba14765 | 23 | PIO_battryMonEn PA_5 |
hakusan270 | 5:fbeb85ebd47b | 24 | PB_7 SDA |
hakusan270 | 5:fbeb85ebd47b | 25 | PB_6 SCL |
tnanbu | 11:2d5fcf102778 | 26 | |
hakusan270 | 0:b76e4ba14765 | 27 | */ |
hakusan270 | 5:fbeb85ebd47b | 28 | //DigitalOut hx_clk(PB_7); |
hakusan270 | 5:fbeb85ebd47b | 29 | //DigitalIn hx_dt(PB_6); |
hakusan270 | 5:fbeb85ebd47b | 30 | //I2C i2cacc(p_sda, p_scl) |
hakusan270 | 5:fbeb85ebd47b | 31 | |
tnanbu | 13:df67ca499051 | 32 | //#include "H3LIS331DL.h" |
tnanbu | 13:df67ca499051 | 33 | |
tnanbu | 13:df67ca499051 | 34 | //#define TIMEINTERVAL |
hakusan270 | 5:fbeb85ebd47b | 35 | |
tnanbu | 13:df67ca499051 | 36 | //キャリブレーション 仮値 |
tnanbu | 21:6ce20b05602a | 37 | #define OFFSET_X 400 |
tnanbu | 22:3d961e5a00a4 | 38 | #define OFFSET_Y 400 |
tnanbu | 21:6ce20b05602a | 39 | #define OFFSET_Z -200 |
tnanbu | 11:2d5fcf102778 | 40 | |
tnanbu | 13:df67ca499051 | 41 | HAL_StatusTypeDef writeEEPROMByte(uint32_t address, uint8_t data); |
tnanbu | 13:df67ca499051 | 42 | uint8_t readEEPROMByte(uint32_t address); |
tnanbu | 13:df67ca499051 | 43 | |
tnanbu | 13:df67ca499051 | 44 | |
tnanbu | 13:df67ca499051 | 45 | //H3LIS331DL h3dacc(PB_7,PB_6); |
tnanbu | 13:df67ca499051 | 46 | I2C i2c(PB_7,PB_6); //NUCLEO pin assign |
hakusan270 | 5:fbeb85ebd47b | 47 | |
hakusan270 | 0:b76e4ba14765 | 48 | RawSerial pc(PA_9, PA_10,115200); //console UART |
tnanbu | 13:df67ca499051 | 49 | //LowPowerTicker interrupt; |
tnanbu | 18:2a42f4052139 | 50 | //Ticker interrupt; |
hakusan270 | 0:b76e4ba14765 | 51 | SPI STSPI(PB_15, PB_14, PB_13); //mosi,miso,clk |
hakusan270 | 0:b76e4ba14765 | 52 | DigitalOut STSPICS(PB_12); |
rgoto | 6:bf4321ef0330 | 53 | |
rgoto | 6:bf4321ef0330 | 54 | SDFileSystem *sd = new SDFileSystem(PA_12, PA_11, PB_3, PA_15, "sd"); // mosi, miso, sclk, cs, name |
rgoto | 6:bf4321ef0330 | 55 | |
hakusan270 | 0:b76e4ba14765 | 56 | DigitalOut led(PB_5); |
hakusan270 | 1:025596ffc973 | 57 | int initLIS3DH(); |
hakusan270 | 1:025596ffc973 | 58 | int read3axes(short *tx,short *ty,short *tz); |
tnanbu | 13:df67ca499051 | 59 | int initLIS331(); |
tnanbu | 13:df67ca499051 | 60 | int read3axes331(short *tx,short *ty,short *tz); |
tnanbu | 13:df67ca499051 | 61 | int int_sqrt(unsigned int x); |
tnanbu | 7:b69fa9bb320d | 62 | //int readTemp(short *tmp); |
tnanbu | 11:2d5fcf102778 | 63 | FILE *fp1,*fp2;//fp1:H3LIS331DL, fp2:LIS3DH |
tnanbu | 13:df67ca499051 | 64 | unsigned long timecount = 0; |
tnanbu | 13:df67ca499051 | 65 | int oldcount = 0; |
tnanbu | 13:df67ca499051 | 66 | //uint8_t maxacc = 0; |
tnanbu | 16:1caaa96ae3eb | 67 | float max_g=0; |
tnanbu | 16:1caaa96ae3eb | 68 | float now_g=0; |
tnanbu | 16:1caaa96ae3eb | 69 | int update=0; |
tnanbu | 13:df67ca499051 | 70 | char buffer1[512] = {}; |
tnanbu | 13:df67ca499051 | 71 | char buffer2[512] = {}; |
tnanbu | 19:2475d32bd93f | 72 | char stracc1[64] = {}, stracc2[32] = {}; |
tnanbu | 13:df67ca499051 | 73 | int lognum1 = 0, lognum2 = 0; |
tnanbu | 13:df67ca499051 | 74 | char filename1[32]= {}; |
tnanbu | 13:df67ca499051 | 75 | char filename2[32]= {}; |
tnanbu | 19:2475d32bd93f | 76 | int ret = 0,init=1; |
tnanbu | 18:2a42f4052139 | 77 | //int timer_flag = 0; |
tnanbu | 11:2d5fcf102778 | 78 | |
tnanbu | 18:2a42f4052139 | 79 | /* |
tnanbu | 13:df67ca499051 | 80 | void timer(){ |
tnanbu | 15:12d0699ad423 | 81 | timer_flag = 1; |
tnanbu | 15:12d0699ad423 | 82 | timecount++; |
tnanbu | 15:12d0699ad423 | 83 | oldcount++; |
tnanbu | 15:12d0699ad423 | 84 | } |
tnanbu | 18:2a42f4052139 | 85 | */ |
tnanbu | 15:12d0699ad423 | 86 | |
tnanbu | 15:12d0699ad423 | 87 | void sub(){ |
tnanbu | 13:df67ca499051 | 88 | short tx=0,ty=0,tz=0; |
tnanbu | 18:2a42f4052139 | 89 | //float scr=0; |
tnanbu | 18:2a42f4052139 | 90 | long scr = 0; |
tnanbu | 13:df67ca499051 | 91 | //static long ax,ay,az,as; |
tnanbu | 13:df67ca499051 | 92 | //static int cnt; |
tnanbu | 13:df67ca499051 | 93 | |
tnanbu | 13:df67ca499051 | 94 | read3axes331(&tx,&ty,&tz); |
tnanbu | 13:df67ca499051 | 95 | //キャリブレーションの補正 |
tnanbu | 13:df67ca499051 | 96 | tx += OFFSET_X; |
tnanbu | 13:df67ca499051 | 97 | ty += OFFSET_Y; |
tnanbu | 13:df67ca499051 | 98 | tz += OFFSET_Z; |
tnanbu | 13:df67ca499051 | 99 | |
tnanbu | 13:df67ca499051 | 100 | //スカラー値変換 |
tnanbu | 18:2a42f4052139 | 101 | scr = int_sqrt( tx*tx + ty*ty + tz*tz);// 195mg/digit |
tnanbu | 13:df67ca499051 | 102 | now_g = scr; |
tnanbu | 13:df67ca499051 | 103 | |
tnanbu | 13:df67ca499051 | 104 | //ax+= tx; |
tnanbu | 13:df67ca499051 | 105 | //ay+= ty; |
tnanbu | 13:df67ca499051 | 106 | //az+= tz; |
tnanbu | 13:df67ca499051 | 107 | //as+= scr; |
tnanbu | 13:df67ca499051 | 108 | //cnt++; |
tnanbu | 19:2475d32bd93f | 109 | pc.printf("new x:%2.2f y:%2.2f,z:%2.2f scaler = %2.2f \r\n",(float)tx*0.005,(float)ty*0.005,(float)tz*0.005,(float)scr*0.005); |
tnanbu | 19:2475d32bd93f | 110 | //pc.printf("new x:%d y:%d,z:%d scaler = %d \r\n",tx,ty,tz,scr); |
tnanbu | 18:2a42f4052139 | 111 | |
tnanbu | 13:df67ca499051 | 112 | if ( max_g < scr) { |
tnanbu | 13:df67ca499051 | 113 | max_g = scr; |
tnanbu | 13:df67ca499051 | 114 | update=1; |
tnanbu | 13:df67ca499051 | 115 | //pc.printf("x:%d y:%d,z:%d scaler = %d max g=%2.2fG \r\n",tx,ty,tz,scr, (float)scr/11.0f); |
tnanbu | 13:df67ca499051 | 116 | //pc.printf("new x:%d y:%d,z:%d scaler = %d max g=%2.2fG \r\n",tx,ty,tz,scr, (float)max_g/11.0f); |
tnanbu | 13:df67ca499051 | 117 | //Save EEPROM |
tnanbu | 13:df67ca499051 | 118 | writeEEPROMByte(0, max_g); |
tnanbu | 8:7f80139df48d | 119 | } |
tnanbu | 13:df67ca499051 | 120 | |
tnanbu | 20:db6a609232d2 | 121 | sprintf(stracc1,"%d,%2.2f,%2.2f,%2.2f,%2.2f\r\n",timecount,(float)tx*0.005,(float)ty*0.005,(float)tz*0.005,(float)scr*0.005); |
tnanbu | 13:df67ca499051 | 122 | //pc.printf("h3lis331dl:%s",stracc1); |
tnanbu | 13:df67ca499051 | 123 | if(strlen(buffer1)+strlen(stracc1) > 512) { |
tnanbu | 11:2d5fcf102778 | 124 | //pc.printf("buffer over. write file2\r\n"); |
tnanbu | 18:2a42f4052139 | 125 | |
tnanbu | 8:7f80139df48d | 126 | ret = fprintf(fp1,"%s",buffer1); |
tnanbu | 13:df67ca499051 | 127 | if(ret == 0){ |
tnanbu | 13:df67ca499051 | 128 | pc.printf("fp1 write failed. Reboot!!!\r\n"); |
tnanbu | 13:df67ca499051 | 129 | NVIC_SystemReset(); |
tnanbu | 13:df67ca499051 | 130 | } |
tnanbu | 18:2a42f4052139 | 131 | |
tnanbu | 19:2475d32bd93f | 132 | |
tnanbu | 8:7f80139df48d | 133 | memset(buffer1,0,sizeof(buffer1)); |
tnanbu | 8:7f80139df48d | 134 | sprintf(buffer1,"%s",stracc1); |
tnanbu | 11:2d5fcf102778 | 135 | |
tnanbu | 11:2d5fcf102778 | 136 | } else { |
tnanbu | 11:2d5fcf102778 | 137 | sprintf(buffer1,"%s%s",buffer1,stracc1); |
tnanbu | 7:b69fa9bb320d | 138 | } |
tnanbu | 13:df67ca499051 | 139 | |
tnanbu | 13:df67ca499051 | 140 | if(oldcount == 10){ |
tnanbu | 11:2d5fcf102778 | 141 | //LIS3DH |
tnanbu | 13:df67ca499051 | 142 | read3axes(&tx,&ty,&tz); |
tnanbu | 13:df67ca499051 | 143 | scr = int_sqrt( tx*tx + ty*ty + tz*tz); |
tnanbu | 13:df67ca499051 | 144 | pc.printf("old x:%d y:%d,z:%d scaler = %d max g=%2.2fG \r\n",tx,ty,tz,scr, (float)max_g/11.0f); |
tnanbu | 14:2707af31e02f | 145 | sprintf(stracc2,"%d,%d\r\n",timecount,scr); |
tnanbu | 11:2d5fcf102778 | 146 | //pc.printf("lis3dh:%s",stracc2); |
tnanbu | 11:2d5fcf102778 | 147 | if(strlen(buffer2)+ strlen(stracc2)> 512) { |
tnanbu | 18:2a42f4052139 | 148 | |
tnanbu | 11:2d5fcf102778 | 149 | ret = fprintf(fp2,"%s",buffer2); |
tnanbu | 13:df67ca499051 | 150 | if(ret == 0){ |
tnanbu | 13:df67ca499051 | 151 | pc.printf("fp2 write failed. Reboot!!!\r\n"); |
tnanbu | 13:df67ca499051 | 152 | NVIC_SystemReset(); |
tnanbu | 13:df67ca499051 | 153 | } |
tnanbu | 18:2a42f4052139 | 154 | |
tnanbu | 11:2d5fcf102778 | 155 | memset(buffer2,0,sizeof(buffer2)); |
tnanbu | 11:2d5fcf102778 | 156 | sprintf(buffer2,"%s",stracc2); |
tnanbu | 11:2d5fcf102778 | 157 | } else { |
tnanbu | 11:2d5fcf102778 | 158 | sprintf(buffer2,"%s%s",buffer2,stracc2); |
tnanbu | 7:b69fa9bb320d | 159 | } |
tnanbu | 13:df67ca499051 | 160 | oldcount = 0; |
tnanbu | 11:2d5fcf102778 | 161 | } |
tnanbu | 19:2475d32bd93f | 162 | |
tnanbu | 13:df67ca499051 | 163 | if(time(NULL) > 86400){ |
tnanbu | 8:7f80139df48d | 164 | //Create New File |
tnanbu | 8:7f80139df48d | 165 | set_time(NULL); |
tnanbu | 11:2d5fcf102778 | 166 | timecount = 0; |
tnanbu | 8:7f80139df48d | 167 | fclose(fp1); |
tnanbu | 8:7f80139df48d | 168 | fclose(fp2); |
tnanbu | 8:7f80139df48d | 169 | lognum1++; |
tnanbu | 8:7f80139df48d | 170 | lognum2++; |
tnanbu | 13:df67ca499051 | 171 | sprintf(filename1,"/sd/new_%d",lognum1); |
tnanbu | 13:df67ca499051 | 172 | sprintf(filename2,"/sd/old_%d",lognum2); |
tnanbu | 8:7f80139df48d | 173 | fp1 = fopen(filename1,"a"); |
tnanbu | 8:7f80139df48d | 174 | if(!fp1){ |
tnanbu | 11:2d5fcf102778 | 175 | pc.printf("fp1 create file failed\r\n"); |
tnanbu | 13:df67ca499051 | 176 | NVIC_SystemReset(); |
tnanbu | 8:7f80139df48d | 177 | } |
tnanbu | 8:7f80139df48d | 178 | fp2 = fopen(filename2,"a"); |
tnanbu | 11:2d5fcf102778 | 179 | if(!fp2){ |
tnanbu | 11:2d5fcf102778 | 180 | pc.printf("fp2 create file failed\r\n"); |
tnanbu | 13:df67ca499051 | 181 | NVIC_SystemReset(); |
tnanbu | 11:2d5fcf102778 | 182 | } |
tnanbu | 7:b69fa9bb320d | 183 | } |
tnanbu | 15:12d0699ad423 | 184 | |
tnanbu | 18:2a42f4052139 | 185 | |
tnanbu | 18:2a42f4052139 | 186 | //timer_flag = 0; |
tnanbu | 13:df67ca499051 | 187 | } |
tnanbu | 13:df67ca499051 | 188 | |
tnanbu | 13:df67ca499051 | 189 | int main() |
tnanbu | 13:df67ca499051 | 190 | { |
tnanbu | 13:df67ca499051 | 191 | //h3dacc.init(H3LIS331DL_ODR_50Hz, H3LIS331DL_NORMAL,H3LIS331DL_FULLSCALE_8);//これで初期化している FULLSCALE_8=400G |
tnanbu | 13:df67ca499051 | 192 | //h3dacc.setHPFMode(H3LIS331DL_HPM_NORMAL_MODE_RES);//High Pass Filter ON |
tnanbu | 13:df67ca499051 | 193 | //h3dacc.setHPFCutOFF(H3LIS331DL_HPFCF_1); |
tnanbu | 13:df67ca499051 | 194 | |
tnanbu | 13:df67ca499051 | 195 | sprintf(filename1,"/sd/new_%d",lognum1); |
tnanbu | 13:df67ca499051 | 196 | sprintf(filename2,"/sd/old_%d",lognum2); |
tnanbu | 13:df67ca499051 | 197 | |
tnanbu | 19:2475d32bd93f | 198 | fp1 = fopen(filename1,"a"); |
tnanbu | 19:2475d32bd93f | 199 | if(!fp1) { |
tnanbu | 19:2475d32bd93f | 200 | pc.printf("fp1(%s) open failed\r\n",filename1); |
tnanbu | 19:2475d32bd93f | 201 | //NVIC_SystemReset(); |
tnanbu | 19:2475d32bd93f | 202 | } |
tnanbu | 19:2475d32bd93f | 203 | fp2 = fopen(filename2,"a"); |
tnanbu | 19:2475d32bd93f | 204 | if(!fp2) { |
tnanbu | 19:2475d32bd93f | 205 | pc.printf("fp2(%s) open failed\r\n",filename2); |
tnanbu | 19:2475d32bd93f | 206 | //NVIC_SystemReset(); |
tnanbu | 13:df67ca499051 | 207 | } |
tnanbu | 13:df67ca499051 | 208 | |
tnanbu | 19:2475d32bd93f | 209 | while(init) { |
tnanbu | 19:2475d32bd93f | 210 | init = initLIS331(); |
tnanbu | 19:2475d32bd93f | 211 | initLIS3DH(); |
tnanbu | 19:2475d32bd93f | 212 | pc.printf(" init acc sensor %d\r\n",ret); |
tnanbu | 19:2475d32bd93f | 213 | wait_ms(100); |
tnanbu | 13:df67ca499051 | 214 | } |
tnanbu | 18:2a42f4052139 | 215 | //interrupt.attach_us(&timer,20000);//20ms |
tnanbu | 13:df67ca499051 | 216 | while(1) |
tnanbu | 13:df67ca499051 | 217 | { |
tnanbu | 18:2a42f4052139 | 218 | //if(timer_flag){ |
tnanbu | 15:12d0699ad423 | 219 | sub(); |
tnanbu | 18:2a42f4052139 | 220 | timecount++; |
tnanbu | 18:2a42f4052139 | 221 | oldcount++; |
tnanbu | 18:2a42f4052139 | 222 | //} |
tnanbu | 18:2a42f4052139 | 223 | wait_ms(200); |
hakusan270 | 0:b76e4ba14765 | 224 | } |
tnanbu | 13:df67ca499051 | 225 | |
hakusan270 | 0:b76e4ba14765 | 226 | } |
tnanbu | 11:2d5fcf102778 | 227 | /*********** porting **************/ |
tnanbu | 11:2d5fcf102778 | 228 | void spiFormat(int b,int m) |
tnanbu | 11:2d5fcf102778 | 229 | { |
tnanbu | 11:2d5fcf102778 | 230 | STSPI.format(b,m); /* 8bit */ |
hakusan270 | 1:025596ffc973 | 231 | } |
tnanbu | 11:2d5fcf102778 | 232 | void spiFrequency(int f) |
tnanbu | 11:2d5fcf102778 | 233 | { |
hakusan270 | 1:025596ffc973 | 234 | STSPI.frequency(f); /* 1Mbps */ |
hakusan270 | 1:025596ffc973 | 235 | } |
tnanbu | 11:2d5fcf102778 | 236 | void spiWriteCS(int cs) |
tnanbu | 11:2d5fcf102778 | 237 | { |
hakusan270 | 1:025596ffc973 | 238 | STSPICS=cs; |
hakusan270 | 1:025596ffc973 | 239 | } |
tnanbu | 11:2d5fcf102778 | 240 | int spiWrite(int wd) |
tnanbu | 11:2d5fcf102778 | 241 | { |
tnanbu | 11:2d5fcf102778 | 242 | return ( STSPI.write(wd)); |
tnanbu | 11:2d5fcf102778 | 243 | } |
tnanbu | 7:b69fa9bb320d | 244 | |
tnanbu | 13:df67ca499051 | 245 | /******************************************************* |
tnanbu | 13:df67ca499051 | 246 | EEPROM WRITE |
tnanbu | 13:df67ca499051 | 247 | ********************************************************/ |
tnanbu | 13:df67ca499051 | 248 | HAL_StatusTypeDef writeEEPROMByte(uint32_t address, uint8_t data) |
tnanbu | 13:df67ca499051 | 249 | { |
tnanbu | 13:df67ca499051 | 250 | HAL_StatusTypeDef status; |
tnanbu | 13:df67ca499051 | 251 | address = address + 0x08080000; |
tnanbu | 13:df67ca499051 | 252 | HAL_FLASHEx_DATAEEPROM_Unlock(); //Unprotect the EEPROM to allow writing |
tnanbu | 13:df67ca499051 | 253 | status = HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_BYTE, address, data); |
tnanbu | 13:df67ca499051 | 254 | HAL_FLASHEx_DATAEEPROM_Lock(); // Reprotect the EEPROM |
tnanbu | 13:df67ca499051 | 255 | return status; |
tnanbu | 13:df67ca499051 | 256 | } |
tnanbu | 13:df67ca499051 | 257 | |
tnanbu | 13:df67ca499051 | 258 | /******************************************************* |
tnanbu | 13:df67ca499051 | 259 | EEPROM READ |
tnanbu | 13:df67ca499051 | 260 | ********************************************************/ |
tnanbu | 13:df67ca499051 | 261 | uint8_t readEEPROMByte(uint32_t address) { |
tnanbu | 13:df67ca499051 | 262 | volatile uint8_t tmp ; |
tnanbu | 13:df67ca499051 | 263 | address = address + 0x08080000; |
tnanbu | 13:df67ca499051 | 264 | tmp = *(__IO uint8_t*)address; |
tnanbu | 13:df67ca499051 | 265 | return tmp; |
tnanbu | 13:df67ca499051 | 266 | } |
tnanbu | 13:df67ca499051 | 267 | |
tnanbu | 13:df67ca499051 | 268 | /*************************** |
tnanbu | 13:df67ca499051 | 269 | integer sqrt |
tnanbu | 13:df67ca499051 | 270 | 整数 sqrt √演算を整数で ライブラリより速い |
tnanbu | 13:df67ca499051 | 271 | ****************************/ |
tnanbu | 13:df67ca499051 | 272 | int int_sqrt(unsigned int x) |
tnanbu | 11:2d5fcf102778 | 273 | { |
tnanbu | 13:df67ca499051 | 274 | register int a = 0, c = 0, y = 0, i = 0, t = x; |
tnanbu | 13:df67ca499051 | 275 | while(t >>= 1){ |
tnanbu | 13:df67ca499051 | 276 | ++i; |
tnanbu | 13:df67ca499051 | 277 | } |
tnanbu | 13:df67ca499051 | 278 | for(i += i & 1; i >= 0; i -= 2){ |
tnanbu | 13:df67ca499051 | 279 | c = (y << 1 | 1) <= x >> i; |
tnanbu | 13:df67ca499051 | 280 | a = a << 1 | c; |
tnanbu | 13:df67ca499051 | 281 | y = y << 1 | c; |
tnanbu | 13:df67ca499051 | 282 | x -= c * y << i; |
tnanbu | 13:df67ca499051 | 283 | y += c; |
tnanbu | 13:df67ca499051 | 284 | } |
tnanbu | 13:df67ca499051 | 285 | return a; |
tnanbu | 7:b69fa9bb320d | 286 | } |