kusano kiyoshige / Mbed 2 deprecated 17robo_tokyo_kaede

Dependencies:   QEI accelerator bit_test cyclic_io cyclic_var cylinder event_var limit mbed mecanum motor_drive pid pid_encoder rs422_put sbdbt servo

Fork of 17robo_fuzi by kusano kiyoshige

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers bno055_lib.h Source File

bno055_lib.h

00001 #ifndef BNO055_H
00002 #define BNO055_H
00003 
00004 //UART通信に使用するバッファの最大サイズ
00005 #define BNO055_UART_BUF_MAXLEN      24      //[byte]
00006 //I2Cデフォルトスレーブアドレス
00007 #define BNO055_I2C_DEFADDR          0x28
00008 
00009 #define BNO055_PAGE_ID              0x07
00010 
00011 #define BNO055P0_CHIP_ID            0x00
00012 #define BNO055P0_ACC_ID             0x01
00013 #define BNO055P0_MAG_ID             0x02
00014 #define BNO055P0_GYR_ID             0x03
00015 #define BNO055P0_SW_REV_ID_LSB      0x04
00016 #define BNO055P0_SW_REV_ID_MSB      0x05
00017 #define BNO055P0_BL_REV_ID          0x06
00018 #define BNO055P0_ACC_DATA_X_LSB     0x08
00019 #define BNO055P0_ACC_DATA_X_MSB     0x09
00020 #define BNO055P0_ACC_DATA_Y_LSB     0x0A
00021 #define BNO055P0_ACC_DATA_Y_MSB     0x0B
00022 #define BNO055P0_ACC_DATA_Z_LSB     0x0C
00023 #define BNO055P0_ACC_DATA_Z_MSB     0x0D
00024 #define BNO055P0_MAG_DATA_X_LSB     0x0E
00025 #define BNO055P0_MAG_DATA_X_MSB     0x0F
00026 #define BNO055P0_MAG_DATA_Y_LSB     0x10
00027 #define BNO055P0_MAG_DATA_Y_MSB     0x11
00028 #define BNO055P0_MAG_DATA_Z_LSB     0x12
00029 #define BNO055P0_MAG_DATA_Z_MSB     0x13
00030 #define BNO055P0_GYR_DATA_X_LSB     0x14
00031 #define BNO055P0_GYR_DATA_X_MSB     0x15
00032 #define BNO055P0_GYR_DATA_Y_LSB     0x16
00033 #define BNO055P0_GYR_DATA_Y_MSB     0x17
00034 #define BNO055P0_GYR_DATA_Z_LSB     0x18
00035 #define BNO055P0_GYR_DATA_Z_MSB     0x19
00036 #define BNO055P0_EUL_HEADING_LSB    0x1A
00037 #define BNO055P0_EUL_HEADING_MSB    0x1B
00038 #define BNO055P0_EUL_ROLL_LSB       0x1C
00039 #define BNO055P0_EUL_ROLL_MSB       0x1D
00040 #define BNO055P0_EUL_PITCH_LSB      0x1E
00041 #define BNO055P0_EUL_PITCH_MSB      0x1F
00042 #define BNO055P0_QUA_DATA_W_LSB     0x20
00043 #define BNO055P0_QUA_DATA_W_MSB     0x21
00044 #define BNO055P0_QUA_DATA_X_LSB     0x22
00045 #define BNO055P0_QUA_DATA_X_MSB     0x23
00046 #define BNO055P0_QUA_DATA_Y_LSB     0x24
00047 #define BNO055P0_QUA_DATA_Y_MSB     0x25
00048 #define BNO055P0_QUA_DATA_Z_LSB     0x26
00049 #define BNO055P0_QUA_DATA_Z_MSB     0x27
00050 #define BNO055P0_LIA_DATA_X_LSB     0x28
00051 #define BNO055P0_LIA_DATA_X_MBS     0x29
00052 #define BNO055P0_LIA_DATA_Y_LSB     0x2A
00053 #define BNO055P0_LIA_DATA_Y_MBS     0x2B
00054 #define BNO055P0_LIA_DATA_Z_LSB     0x2C
00055 #define BNO055P0_LIA_DATA_Z_MBS     0x2D
00056 #define BNO055P0_GRV_DATA_X_LSB     0x2E
00057 #define BNO055P0_GRV_DATA_X_MSB     0x2F
00058 #define BNO055P0_GRV_DATA_Y_LSB     0x30
00059 #define BNO055P0_GRV_DATA_Y_MSB     0x31
00060 #define BNO055P0_GRV_DATA_Z_LSB     0x32
00061 #define BNO055P0_GRV_DATA_Z_MSB     0x33
00062 #define BNO055P0_TEMP               0x34
00063 #define BNO055P0_CALIB_STAT         0x35
00064 #define BNO055P0_ST_RESULT          0x36
00065 #define BNO055P0_INT_STA            0x37
00066 #define BNO055P0_SYS_CLK_STATUS     0x38
00067 #define BNO055P0_SYS_STATUS         0x39
00068 #define BNO055P0_SYS_ERR            0x3A
00069 #define BNO055P0_UNIT_SEL           0x3B
00070 #define BNO055P0_OPR_MODE           0x3D
00071 #define BNO055P0_PWR_MODE           0x3E
00072 #define BNO055P0_SYS_TRIGGER        0x3F
00073 #define BNO055P0_TEMP_SOURCE        0x40
00074 #define BNO055P0_AXIS_MAP_CONFIG    0x41
00075 #define BNO055P0_AXIS_MAP_SIGN      0x42
00076 #define BNO055P0_ACC_OFFSET_X_LSB   0x55
00077 #define BNO055P0_ACC_OFFSET_X_MSB   0x56
00078 #define BNO055P0_ACC_OFFSET_Y_LSB   0x57
00079 #define BNO055P0_ACC_OFFSET_Y_MSB   0x58
00080 #define BNO055P0_ACC_OFFSET_Z_LSB   0x59
00081 #define BNO055P0_ACC_OFFSET_Z_MSB   0x5A
00082 #define BNO055P0_MAG_OFFSET_X_LSB   0x5B
00083 #define BNO055P0_MAG_OFFSET_X_MSB   0x5C
00084 #define BNO055P0_MAG_OFFSET_Y_LSB   0x5D
00085 #define BNO055P0_MAG_OFFSET_Y_MSB   0x5E
00086 #define BNO055P0_MAG_OFFSET_Z_LSB   0x5F
00087 #define BNO055P0_MAG_OFFSET_Z_MSB   0x60
00088 #define BNO055P0_GYR_OFFSET_X_LSB   0x61
00089 #define BNO055P0_GYR_OFFSET_X_MSB   0x62
00090 #define BNO055P0_GYR_OFFSET_Y_LSB   0x63
00091 #define BNO055P0_GYR_OFFSET_Y_MSB   0x64
00092 #define BNO055P0_GYR_OFFSET_Z_LSB   0x65
00093 #define BNO055P0_GYR_OFFSET_Z_MSB   0x66
00094 #define BNO055P0_ACC_RADIUS_LSB     0x67
00095 #define BNO055P0_ACC_RADIUS_MSB     0x68
00096 #define BNO055P0_MAG_RADIUS_LSB     0x69
00097 #define BNO055P0_MAG_RADIUS_MSB     0x6A
00098 
00099 #define BNO055P1_ACC_CONFIG         0x08
00100 #define BNO055P1_MAG_CONFIG         0x09
00101 #define BNO055P1_GYR_CONFIG_0       0x0A
00102 #define BNO055P1_GYR_CONFIG_1       0x0B
00103 #define BNO055P1_ACC_SLEEP_CONFIG   0x0C
00104 #define BNO055P1_GYR_SLEEP_CONFIG   0x0D
00105 #define BNO055P1_INT_MSK            0x0F
00106 #define BNO055P1_INT_EN             0x10
00107 #define BNO055P1_ACC_AM_THRES       0x11
00108 #define BNO055P1_ACC_INT_SETTINGS   0x12
00109 #define BNO055P1_ACC_HG_DURATION    0x13
00110 #define BNO055P1_ACC_HG_THRES       0x14
00111 #define BNO055P1_ACC_NM_THRES       0x15
00112 #define BNO055P1_ACC_NM_SET         0x16
00113 #define BNO055P1_GYR_INT_SETING     0x17
00114 #define BNO055P1_GYR_HR_X_SET       0x18
00115 #define BNO055P1_GYR_DUR_X          0x19
00116 #define BNO055P1_GYR_HR_Y_SET       0x1A
00117 #define BNO055P1_GYR_DUR_Y          0x1B
00118 #define BNO055P1_GYR_HR_Z_SET       0x1C
00119 #define BNO055P1_GYR_DUR_Z          0x1D
00120 #define BNO055P1_GYR_AM_THRES       0x1E
00121 #define BNO055P1_GYR_AM_SET         0x1F
00122 
00123 class BNO055_CTRL{
00124 public:
00125     BNO055_CTRL();
00126     virtual ~BNO055_CTRL();
00127 protected:
00128     bool page1;
00129     char *ary;
00130     char lastError;
00131     char lastLength;
00132 public:
00133     char getNowPage();
00134     char getLastError();
00135     char getLastLength();
00136     virtual void init();
00137     virtual char rr(bool isPage1, char regAddr);
00138     virtual char rrc(bool isPage1, char startRegAddr, char *receiveBytes, char length);
00139     virtual char wr(bool isPage1, char regAddr, char wBytes);
00140     virtual char wrc(bool isPage1, char startRegAddr, char *Bytes, char length);
00141 };
00142 
00143 class BNO055_UART_CTRL : public BNO055_CTRL{
00144 public:
00145     BNO055_UART_CTRL(RawSerial *uart);
00146     virtual ~BNO055_UART_CTRL();
00147 private:
00148     RawSerial *iface;
00149     short rxd;
00150     bool read_mark;
00151 
00152     void rxInterrupt();
00153 public:
00154     virtual void init();
00155     virtual char rr(bool isPage1, char regAddr);
00156     virtual char rrc(bool isPage1, char startRegAddr, char *receiveBytes, char length);
00157     virtual char wr(bool isPage1, char regAddr, char wBytes);
00158     virtual char wrc(bool isPage1, char startRegAddr, char *Bytes, char length);
00159 };
00160 
00161 class BNO055_I2C_CTRL : public BNO055_CTRL{
00162 public:
00163     BNO055_I2C_CTRL(I2C *iic, char addr, unsigned int freq);
00164     virtual ~BNO055_I2C_CTRL();
00165 private:
00166     I2C *iface;
00167     char i2c_writeAddr;
00168     char i2c_readAddr;
00169     unsigned int i2c_freq;
00170 public:
00171     virtual void init();
00172     virtual char rr(bool isPage1, char regAddr);
00173     virtual char rrc(bool isPage1, char startRegAddr, char *receiveBytes, char length);
00174     virtual char wr(bool isPage1, char regAddr, char wBytes);
00175     virtual char wrc(bool isPage1, char startRegAddr, char *Bytes, char length);
00176 };
00177 
00178 class BOARDC_BNO055{
00179 public:
00180     BOARDC_BNO055(PinName tx, PinName rx);
00181     BOARDC_BNO055(RawSerial *uart);
00182     BOARDC_BNO055(PinName scl, PinName sda, char addr=BNO055_I2C_DEFADDR, unsigned int freq=100000);
00183     BOARDC_BNO055(I2C *iic, char addr=BNO055_I2C_DEFADDR, unsigned int freq=100000);
00184     ~BOARDC_BNO055();
00185 
00186 private:
00187     BNO055_CTRL *ctrl;
00188     float scaleACC;
00189     float scaleMAG; //fixed
00190     float scaleGYRO;
00191     float scaleTEMP;
00192     float scaleEuler;
00193     float scaleLIA; //=scaleACC
00194     float scaleGV; //=scaleACC
00195     double scaleQuaternion; //fixed
00196     unsigned char axisRemap;
00197     unsigned char axisSign;
00198     bool clkExt;
00199 
00200 public:
00201     char initialize(bool resetIface=true);
00202     char getIfaceLastError();
00203     char getIfaceLastLength();
00204 
00205     char customRead(bool isPage1, char regAddr);
00206     char customReadC(bool isPage1, char startRegAddr, char *receiveBytes, unsigned char length);
00207     char customWrite(bool isPage1, char regAddr, char wBytes);
00208     char customWriteC(bool isPage1, char startRegAddr, char *Bytes, unsigned char length);
00209 
00210     char getPage();
00211     void setPage(unsigned char pageNo);
00212 
00213     char getChipID();
00214     char getAccChipID();
00215     char getMagChipID();
00216     char getGyroChipID();
00217 
00218     short getRevision();
00219     char getBootRevision();
00220 
00221     float getAccScale();
00222     float getMagScale();
00223     float getGyroScale();
00224     float getTempScale();
00225     float getEulerScale();
00226     float getLinearScale();
00227     float getGVScale();
00228     double getQuaternionScale();
00229 
00230     void getAccDataAll(short &accX, short &accY, short &accZ);
00231     short getAccDataX();
00232     short getAccDataY();
00233     short getAccDataZ();
00234 
00235     void getMagDataAll(short &magX, short &magY, short &magZ);
00236     short getMagDataX();
00237     short getMagDataY();
00238     short getMagDataZ();
00239 
00240     void getGyroDataAll(short &gyroX, short &gyroY, short &gyroZ);
00241     short getGyroDataX();
00242     short getGyroDataY();
00243     short getGyroDataZ();
00244 
00245     void getEulerDataAll(short &E_heading, short &E_roll, short &E_pitch);
00246     short getEulerDataHeading();
00247     short getEulerDataYaw();
00248     short getEulerDataRoll();
00249     short getEulerDataPitch();
00250 
00251     void get9Axis(short *box);
00252     void get9AxisAndEUL(short *box);
00253 
00254     void getQuaternion(short &q1, short &q2, short &q3, short &q4);
00255 
00256     void getLinearAccDataAll(short &L_accX, short &L_accY, short &L_accZ);
00257     short getLinearAccDataX();
00258     short getLinearAccDataY();
00259     short getLinearAccDataZ();
00260 
00261     void getGVectorDataAll(short &gvX, short &gvY, short &gvZ);
00262     short getGVectorDataX();
00263     short getGVectorDataY();
00264     short getGVectorDataZ();
00265 
00266     char getTemperature();
00267 
00268     void getCalibStatusAll(char &sys, char &acc, char &mag, char &gyro);
00269     char getCalibStatusSys();
00270     char getCalibStatusAcc();
00271     char getCalibStatusMag();
00272     char getCalibStatusGyro();
00273 
00274     char getSelfTestResultAll();
00275     bool getSelfTestResultMCU();
00276     bool getSelfTestResultAcc();
00277     bool getSelfTestResultMag();
00278     bool getSelfTestResultGyro();
00279 
00280     char triggeredIntALL();
00281     bool triggeredACC_NM();
00282     bool triggeredACC_AM();
00283     bool triggeredACC_HIGH_G();
00284     bool triggeredGYR_HIGH_RATE();
00285     bool triggeredGYRO_AM();
00286 
00287     bool isSystemClockFixed();
00288 
00289     char getSystemStatus();
00290     char getSystemError();
00291 
00292     char getUNIT_SEL();
00293     char setUNIT_SEL(char selectValue);
00294     char setUNIT_AccUnit(bool isMeterPerSec2=true);
00295     char setUNIT_GyroUnit(bool isDps=true);
00296     char setUNIT_EulerUnit(bool isDegrees=true);
00297     char setUNIT_Temperature(bool isCelsius=true);
00298     char setUNIT_OrientationMode(bool ori_Android=true);
00299 
00300     char getOperationMode();
00301     char setOperationMode(char modeValue);
00302     char setOperation_CONFIG();
00303     char setOperation_ACCONRY();
00304     char setOperation_MAGONRY();
00305     char setOperation_GYROONRY();
00306     char setOperation_ACCMAG();
00307     char setOperation_ACCGYRO();
00308     char setOperation_MAGGYRO();
00309     char setOperation_AMG();
00310     char setOperation_Fusion_IMU();
00311     char setOperation_Fusion_COMPASS();
00312     char setOperation_Fusion_M4G();
00313     char setOperation_Fusion_NDOF_FMC_OFF();
00314     char setOperation_Fusion_NDOF();
00315 
00316     char getPowerMode();
00317     char setPowerMode(unsigned char modeValue);
00318     char setPowerMode_Normal();
00319     char setPowerMode_LowPower();
00320     char setPowerMode_Suspend();
00321 
00322     char setSysTrigger(char regVal);
00323     char setSys_ExternalCrystal(bool isExternal=true);
00324     char resetInterrupt();
00325     char soft_reset();
00326     char execSelfTest();
00327 
00328     char getTempSource();
00329     char setTempSource(bool Accelerometer=true);
00330 
00331     char getAxisMapConfig();
00332     char setAxisMapConfig(char val);
00333     char getAxisMapSign();
00334     char setAxisMapSign(char val);
00335     char setAxisRemap_topview_topleft();
00336     char setAxisRemap_topview_topright();
00337     char setAxisRemap_topview_bottomleft();
00338     char setAxisRemap_topview_bottomright();
00339     char setAxisRemap_bottomview_topleft();
00340     char setAxisRemap_bottomview_topright();
00341     char setAxisRemap_bottomview_bottomleft();
00342     char setAxisRemap_bottomview_bottomright();
00343     char getAxisRemap_type();
00344 
00345     void getAccOffsetAll(float &offsetX, float &offsetY, float &offsetZ);
00346     float getAccOffsetX();
00347     float getAccOffsetY();
00348     float getAccOffsetZ();
00349     char setAccOffsetAll(float offsetX, float offsetY, float offsetZ);
00350     char setAccOffsetX(float offset);
00351     char setAccOffsetY(float offset);
00352     char setAccOffsetZ(float offset);
00353 
00354     void getMagOffsetAll(float &offsetX, float &offsetY, float &offsetZ);
00355     float getMagOffsetX();
00356     float getMagOffsetY();
00357     float getMagOffsetZ();
00358     char setMagOffsetAll(float offsetX, float offsetY, float offsetZ);
00359     char setMagOffsetX(float offset);
00360     char setMagOffsetY(float offset);
00361     char setMagOffsetZ(float offset);
00362 
00363     void getGyroOffsetAll(float &offsetX, float &offsetY, float &offsetZ);
00364     float getGyroOffsetX();
00365     float getGyroOffsetY();
00366     float getGyroOffsetZ();
00367     char setGyroOffsetAll(float offsetX, float offsetY, float offsetZ);
00368     char setGyroOffsetX(float offset);
00369     char setGyroOffsetY(float offset);
00370     char setGyroOffsetZ(float offset);
00371 
00372     short getAccRadius();
00373     char setAccRadius(short LSB);
00374 
00375     short getMagRadius();
00376     char setMagRadius(short LSB);
00377 
00378     char getAccConfig();
00379     char setAccConfig(char regVal);
00380     char setAccConfig(char gRange, char bandWidth, char powMode);
00381     char setAccRange(unsigned char G);
00382 
00383     char getMagConfig();
00384     char setMagConfig(char regVal);
00385     char setMagConfig(char rate, char oprMode, char powMode);
00386 
00387     char getGyroConfig_0();
00388     char setGyroConfig_0(char regVal);
00389     char setGyroConfig_0(char range, char bandWidth);
00390     char getGyroConfig_1();
00391     char setGyroConfig_1(char powMode);
00392     char setGyroRange(unsigned short dps);
00393 
00394     char getAccSleepConfig();
00395     char setAccSleepConfig(char regVal);
00396     char setAccSleepConfig(char duration, char mode);
00397 
00398     char getGyroSleepConfig();
00399     char setGyroSleepConfig(char regVal);
00400     char setGyroSleepConfig(char autoSleepDuration, char duration);
00401 
00402     char getInterruptMask();
00403     char setInterruptMask(char mask);
00404 
00405     char getInterruptEnable();
00406     char setInterruptEnable(char mask);
00407 
00408     float getAccAnyMotionThreashold(bool ismg=true);
00409     char setAccAnyMotionThreashold(bool ismg, float threashold);
00410 
00411     char getAccInterruptSettings();
00412     char setAccInterruptSettings(char settings);
00413 
00414     unsigned short getAccHighGduration();
00415     char setAccHighGduration(short ms);
00416 
00417     float getAccHighGThreashold(bool ismg=true);
00418     char setAccHighGThreashold(bool ismg, float threashold);
00419 
00420     float getAccNMThreashold(bool ismg=true);
00421     char setAccNMThreashold(bool ismg, float threashold);
00422 
00423     char getAccNMsetting();
00424     char setAccNMsetting(char setting);
00425 
00426     char getGyroInterruptSettings();
00427     char setGyroInterruptSettings(char settings);
00428 
00429     char getGyroHighRateXsetting();
00430     void getGyroHighRateXsetting_dps(float &hyst, float &thres);
00431     char setGyroHighRateXsetting(char setting);
00432     char setGyroHighRateXsetting_dps(float hystVal, float thresVal);
00433     float getGyroHighRateXduration();
00434     char setGyroHighRateXduration(float duration);
00435 
00436     char getGyroHighRateYsetting();
00437     void getGyroHighRateYsetting_dps(float &hyst, float &thres);
00438     char setGyroHighRateYsetting(char setting);
00439     char setGyroHighRateYsetting_dps(float hystVal, float thresVal);
00440     float getGyroHighRateYduration();
00441     char setGyroHighRateYduration(float duration);
00442 
00443     char getGyroHighRateZsetting();
00444     void getGyroHighRateZsetting_dps(float &hyst, float &thres);
00445     char setGyroHighRateZsetting(char setting);
00446     char setGyroHighRateZsetting_dps(float hystVal, float thresVal);
00447     float getGyroHighRateZduration();
00448     char setGyroHighRateZduration(float duration);
00449 
00450     float getGyroAnyMotionThreashold();
00451     char setGyroAnyMotionThreashold(float threashold);
00452 
00453     char getAccAnyMotionSetting();
00454     char setAccAnyMotionSetting(char setting);
00455 };
00456 
00457 #endif
00458 
00459 
00460 //CLASS:BNO055_CTRL//////////////////////////////////////////////////
00461 /* ------------------------------------------------------------------
00462  * BNO055_UART_CTRLクラスとBNO055_I2C_CTRLクラスの基底クラス(インターフェース)
00463  * UARTとI2Cをヘッダ書き換えなしで実現するために無理するとこうなった
00464  */
00465 
00466 /* ==================================================================
00467  * デフォルトコンストラクタ
00468  */
00469 BNO055_CTRL::BNO055_CTRL(){
00470     lastError = 0;
00471     lastLength = 0;
00472 }
00473 
00474 /* ==================================================================
00475  * デフォルトデストラクタ
00476  */
00477 BNO055_CTRL::~BNO055_CTRL(){}
00478 
00479 /* ==================================================================
00480  * 現在のページIDを取得する
00481  */
00482 char BNO055_CTRL::getNowPage(){
00483     return page1 ? 1 : 0;
00484 }
00485 
00486 /* ==================================================================
00487  * UARTまたはI2Cで取得した最後のエラーを取得する:通信がうまくいかないときの原因追及
00488  */
00489 char BNO055_CTRL::getLastError(){
00490     return lastError;
00491 }
00492 
00493 /* ==================================================================
00494  * UARTまたはI2Cで通信した際の受信バイト数を取得する:通信がうまくいかないときの原因追及
00495  */
00496 char BNO055_CTRL::getLastLength(){
00497     return lastLength;
00498 }
00499 
00500 /* ==================================================================
00501  * 未実装関数(子クラスで実装される)
00502  */
00503 void BNO055_CTRL::init(){}
00504 char BNO055_CTRL::rr(bool isPage1, char regAddr){return 0;}
00505 char BNO055_CTRL::rrc(bool isPage1, char startRegAddr, char *receiveBytes, char length){return 0;}
00506 char BNO055_CTRL::wr(bool isPage1, char regAddr, char wBytes){return 0;}
00507 char BNO055_CTRL::wrc(bool isPage1, char startRegAddr, char *Bytes, char length){return 0;}
00508 
00509 
00510 
00511 
00512 
00513 
00514 
00515 
00516 
00517 
00518 //CLASS:BNO055_UART_CTRL/////////////////////////////////////////////
00519 /* ------------------------------------------------------------------
00520  * BNO055_CTRLクラス(インターフェース)を継承(実装)したクラス
00521  * UARTで命令を送受信するためのコントロール用クラス
00522  */
00523 
00524 /* ==================================================================
00525  * BNO055をUARTでコントロールするためのクラス:コンストラクタ
00526  */
00527 BNO055_UART_CTRL::BNO055_UART_CTRL(RawSerial *uart){
00528     iface = uart;
00529     rxd = 0xFFFF;
00530     read_mark = true;
00531 
00532     page1 = true;
00533 
00534     ary = new char[BNO055_UART_BUF_MAXLEN + 5];
00535     memset(ary, 0, BNO055_UART_BUF_MAXLEN + 5);
00536     lastError = 0;
00537 }
00538 
00539 /* ==================================================================
00540  * BNO055をUARTでコントロールするためのクラス:デストラクタ
00541  */
00542 BNO055_UART_CTRL::~BNO055_UART_CTRL(){
00543     delete iface;
00544 }
00545 
00546 /* ==================================================================
00547  * UART受信割り込み用関数
00548  * RX受信トリガがONになると、カウンタを加算する
00549  */
00550 void BNO055_UART_CTRL::rxInterrupt(){
00551     if(read_mark){
00552         rxd = iface->getc();
00553         read_mark = false;
00554     }
00555 }
00556 
00557 /* ==================================================================
00558  * <UART>
00559  * レジスタの内容を読み取り(1byteのみ)
00560  * ------------------------------------------------------------------
00561  * returns:
00562  * -1           失敗
00563  * それ以外     成功した際に取得したデータ
00564  */
00565 char BNO055_UART_CTRL::rr(bool isPage1, char regAddr){
00566     //ページが異なるならページ変更命令を発行
00567     if(page1 != isPage1){
00568         wr(page1, BNO055_PAGE_ID, (isPage1) ? 1 : 0);
00569         page1 = isPage1;
00570     }
00571 
00572     //送信可能になるまで待つ
00573     do{wait_ms(1);}while(!iface->writeable());
00574 
00575     //コマンドをセット
00576     ary[0] = 0xAA;      //StartByte(固定)
00577     ary[1] = 0x01;      //読み取り
00578     ary[2] = regAddr;   //レジスタアドレス
00579     ary[3] = 1;         //バイト長
00580 
00581     //送信
00582     iface->putc(ary[0]);
00583     iface->putc(ary[1]);
00584     iface->putc(ary[2]);
00585     iface->putc(ary[3]);
00586 
00587     //レスポンスを受信するまで待つ
00588     while(read_mark) wait_us(100);
00589 
00590     lastError = 0;
00591     memset(ary, 0, BNO055_UART_BUF_MAXLEN + 5); //配列ゼロクリア
00592 
00593     ary[0] = rxd & 0xFF;
00594 
00595     //残りを受信
00596     int i = 1;
00597     int cnt = (ary[0] == 0xBB) ? 2 : 1;
00598     while(i < cnt && iface->readable()){
00599         ary[i++] = iface->getc();
00600     }
00601 
00602     //レスポンスが0xBB以外:通信失敗
00603     if(ary[0] != 0xBB){
00604         lastLength = 2;
00605         lastError = ary[1];
00606         //受信用割り込みマークをリセット
00607         rxd = 0xFFFF;
00608         read_mark = true;
00609         return -1;
00610     }
00611 
00612     lastLength = ary[1] + 2;
00613 
00614     //受信用割り込みマークをリセット
00615     rxd = 0xFFFF;
00616     read_mark = true;
00617 
00618     //通信成功時、取得データを返す
00619     return ary[2];
00620 }
00621 
00622 /* ==================================================================
00623  * <UART>
00624  * レジスタの内容を読み取り(複数可)
00625  * ------------------------------------------------------------------
00626  * returns:
00627  * -1           失敗
00628  * -2           返答バイト不一致
00629  * -4           レスポンスエラー
00630  * それ以外     成功した際の戻り値バイト数
00631  */
00632 char BNO055_UART_CTRL::rrc(bool isPage1, char startRegAddr, char *receiveBytes, char length){
00633     //読み取りバイト数が1未満またはBNO055_UART_BUF_MAXLEN以上はバッファが足りないので読み取れない
00634     if(length < 1 || length > BNO055_UART_BUF_MAXLEN) return -1;
00635 
00636     //ページが異なるならページ変更命令を発行
00637     if(page1 != isPage1){
00638         wr(page1, BNO055_PAGE_ID, (isPage1) ? 1 : 0);
00639         page1 = isPage1;
00640     }
00641 
00642     //送信可能になるまで待つ
00643     do{wait_ms(1);}while(!iface->writeable());
00644 
00645     //コマンドをセット
00646     ary[0] = 0xAA;          //StartByte(固定)
00647     ary[1] = 0x01;          //読み取り
00648     ary[2] = startRegAddr;  //読み取り開始レジスタアドレス
00649     ary[3] = length;        //バイト長
00650 
00651     //送信
00652     iface->putc(ary[0]);
00653     iface->putc(ary[1]);
00654     iface->putc(ary[2]);
00655     iface->putc(ary[3]);
00656 
00657     //レスポンスを受信するまで待つ
00658     while(read_mark) wait_us(100);
00659 
00660     lastError = 0;
00661     memset(ary, 0, BNO055_UART_BUF_MAXLEN + 5); //配列ゼロクリア
00662 
00663     ary[0] = rxd & 0xFF;
00664 
00665     //残りを受信
00666     int i = 1;
00667     int cnt = (ary[0] == 0xBB) ? 2 : 1;
00668     while(i < cnt && iface->readable()){
00669         ary[i++] = iface->getc();
00670     }
00671 
00672     //レスポンスが0xBB以外:通信失敗
00673     if(ary[0] != 0xBB){
00674         lastLength = 2;
00675         lastError = ary[1];
00676         rxd = 0xFFFF;
00677         read_mark = true;
00678         return -1;
00679     }
00680 
00681     //返答バイト長がlengthと一致しない:通信失敗
00682     if(ary[1] != length){
00683         lastLength = ary[1];
00684         lastError = 0;
00685         //受信用割り込みマークをリセット
00686         rxd = 0xFFFF;
00687         read_mark = true;
00688         return -2;
00689     }
00690 
00691     lastLength = ary[1] + 2;
00692 
00693     memcpy(receiveBytes, ary+2, ary[1]);
00694 
00695     //受信用割り込みマークをリセット
00696     rxd = 0xFFFF;
00697     read_mark = true;
00698 
00699     return ary[1];
00700 }
00701 
00702 /* ==================================================================
00703  * <UART>
00704  * レジスタ書き込み(1byteのみ)
00705  * ------------------------------------------------------------------
00706  * returns:
00707  * -1           失敗
00708  * 1            成功
00709  */
00710 char BNO055_UART_CTRL::wr(bool isPage1, char regAddr, char wBytes){
00711     //ページが異なるならページ変更命令を発行(再帰処理)
00712     if(page1 != isPage1){
00713         wr(page1, BNO055_PAGE_ID, (isPage1) ? 1 : 0);
00714         page1 = isPage1;
00715     }
00716 
00717     //送信可能になるまで待つ
00718     do{wait_ms(1);}while(!iface->writeable());
00719 
00720     //コマンドをセット
00721     ary[0] = 0xAA;      //StartByte(固定)
00722     ary[1] = 0x00;      //書き込み
00723     ary[2] = regAddr;   //レジスタアドレス
00724     ary[3] = 1;         //バイト長
00725     ary[4] = wBytes;    //送信データ
00726 
00727     //送信
00728     iface->putc(ary[0]);
00729     iface->putc(ary[1]);
00730     iface->putc(ary[2]);
00731     iface->putc(ary[3]);
00732     iface->putc(ary[4]);
00733 
00734     //システムリブートが発生するレジスタの場合は1200ms待つ
00735     if(regAddr == 0x3F) wait_ms(1200);
00736 
00737     //レスポンスを受信するまで待つ
00738     while(read_mark) wait_us(100);
00739 
00740     lastError = 0;
00741     memset(ary, 0, BNO055_UART_BUF_MAXLEN + 5); //配列ゼロクリア
00742 
00743     ary[0] = rxd & 0xFF;
00744 
00745     //残りを受信
00746     while(iface->readable()){
00747         ary[1] = iface->getc();
00748     }
00749 
00750     //レスポンスが0xEE以外もしくはステータスが0x01以外:書き込み失敗
00751     if(ary[0] != 0xEE || ary[1] != 0x01){
00752         lastLength = 2;
00753         lastError = ary[1];
00754         //受信用割り込みマークをリセット
00755         rxd = 0xFFFF;
00756         read_mark = true;
00757         return -1;
00758     }
00759 
00760     //受信用割り込みマークをリセット
00761     rxd = 0xFFFF;
00762     read_mark = true;
00763 
00764     return 1;
00765 }
00766 
00767 /* ==================================================================
00768  * <UART>
00769  * レジスタ書き込み(複数可)
00770  * ------------------------------------------------------------------
00771  * returns:
00772  * -1           失敗
00773  * -4           レスポンスエラー
00774  * 1            成功
00775  */
00776 char BNO055_UART_CTRL::wrc(bool isPage1, char startRegAddr, char *Bytes, char length){
00777     //書き込みバイト数が1未満またはBNO055_UART_BUF_MAXLEN以上はバッファが足りないので読み取れない
00778     if(length < 1 || length > BNO055_UART_BUF_MAXLEN) return -1;
00779 
00780     //ページが異なるならページ変更命令を発行(再帰処理)
00781     if(page1 != isPage1){
00782         wr(page1, BNO055_PAGE_ID, (isPage1) ? 1 : 0);
00783         page1 = isPage1;
00784     }
00785 
00786     //送信可能になるまで待つ
00787     do{wait_ms(1);}while(!iface->writeable());
00788 
00789     //コマンドをセット
00790     ary[0] = 0xAA;          //StartByte(固定)
00791     ary[1] = 0x00;          //書き込み
00792     ary[2] = startRegAddr;  //レジスタアドレス
00793     ary[3] = length;        //バイト長
00794 
00795     //前部分送信
00796     iface->putc(ary[0]);
00797     iface->putc(ary[1]);
00798     iface->putc(ary[2]);
00799     iface->putc(ary[3]);
00800 
00801     //データ内容送信
00802     for(int cnt=0; cnt<length; cnt++){
00803         iface->putc(Bytes[cnt]);
00804     }
00805 
00806     //レスポンスを受信するまで待つ
00807     while(read_mark) wait_us(100);
00808 
00809     lastError = 0;
00810     memset(ary, 0, BNO055_UART_BUF_MAXLEN + 5); //配列ゼロクリア
00811 
00812     ary[0] = rxd & 0xFF;
00813 
00814     //残りを受信
00815     while(iface->readable()){
00816         ary[1] = iface->getc();
00817     }
00818 
00819     //レスポンスが0xEE以外もしくはステータスが0x01以外:書き込み失敗
00820     if(ary[0] != 0xEE || ary[1] != 0x01){
00821         lastLength = 2;
00822         lastError = ary[1];
00823         //受信用割り込みマークをリセット
00824         rxd = 0xFFFF;
00825         read_mark = true;
00826         return -1;
00827     }
00828 
00829     //受信用割り込みマークをリセット
00830     rxd = 0xFFFF;
00831     read_mark = true;
00832 
00833     return 1;
00834 }
00835 
00836 /* ==================================================================
00837  * <UART>
00838  * インターフェース設定を初期化する
00839  */
00840 void BNO055_UART_CTRL::init(){
00841     iface->format(); //8N1 = default
00842     iface->baud(115200);
00843     wait_ms(5);
00844     iface->attach(this, &BNO055_UART_CTRL::rxInterrupt);
00845 
00846     //送信可能になるまで待つ
00847     do{wait_ms(1);}while(!iface->writeable());
00848 
00849     //UARTリセット時に0xFFがつく現象および前回送信時の残りがあるため同期がとれない
00850     //複数回読み取りを行い、正しいレスポンス(0xBB)が返るまで送信
00851     iface->putc(0x01); //dummy
00852     iface->putc(0x01); //dummy
00853     iface->putc(0x01); //dummy
00854     iface->putc(0x01); //dummy
00855 
00856     //レスポンスを受信するまで待つ
00857     while(read_mark) wait_us(100);
00858 
00859     char rslt = rxd & 0xFF; //レスポンス
00860 
00861     do{
00862         //レスポンスが異常:残りの情報を無視
00863         if(rslt != 0xBB){
00864             while(iface->readable()){
00865                 iface->getc();
00866             }
00867         }
00868 
00869         //受信用割り込みマークをリセット
00870         rxd = 0xFFFF;
00871         read_mark = true;
00872 
00873         //送信可能になるまで待つ
00874         do{wait_ms(5);}while(!iface->writeable());
00875 
00876         iface->putc(0xAA); //START
00877         iface->putc(0x01); //読み取り
00878         iface->putc(0x07); //ページID
00879         iface->putc(0x01); //length 1byte
00880 
00881         //レスポンスを受信するまで待つ
00882         while(read_mark) wait_us(100);
00883 
00884         rslt = rxd & 0xFF; //レスポンス
00885 
00886     }while(rslt != 0xBB);
00887 
00888     //残りの情報を無視
00889     while(iface->readable()){
00890         iface->getc();
00891     }
00892 
00893     //受信用割り込みマークをリセット
00894     rxd = 0xFFFF;
00895     read_mark = true;
00896 }
00897 
00898 
00899 
00900 
00901 
00902 
00903 
00904 
00905 //CLASS:BNO055_I2C_CTRL//////////////////////////////////////////////
00906 /* ------------------------------------------------------------------
00907  * BNO055_CTRLクラス(インターフェース)を継承(実装)したクラス
00908  * I2Cで命令を送受信するためのコントロール用クラス
00909  */
00910 
00911 /* ==================================================================
00912  * BNO055をI2Cでコントロールするためのクラス:コンストラクタ
00913  */
00914 BNO055_I2C_CTRL::BNO055_I2C_CTRL(I2C* iic, char addr, unsigned int freq){
00915     iface = iic;
00916     i2c_writeAddr = addr << 1;
00917     i2c_readAddr = i2c_writeAddr + 1;
00918     i2c_freq = freq;
00919     page1 = true;
00920     ary = new char[2];
00921     memset(ary, 0, 2);
00922     lastError = 0;
00923 }
00924 
00925 /* ==================================================================
00926  * BNO055をI2Cでコントロールするためのクラス:デストラクタ
00927  */
00928 BNO055_I2C_CTRL::~BNO055_I2C_CTRL(){
00929     delete iface;
00930     delete[] ary;
00931 }
00932 
00933 /* ==================================================================
00934  * <I2C>
00935  * レジスタの内容を読み取り(1byteのみ)
00936  */
00937 char BNO055_I2C_CTRL::rr(bool isPage1, char regAddr){
00938     //ページが異なるならページ変更命令を発行
00939     if(page1 != isPage1){
00940         ary[0] = BNO055_PAGE_ID;
00941         ary[1] = (isPage1) ? 1 : 0;
00942         page1 = isPage1;
00943         iface->write(i2c_writeAddr, ary, 2);
00944     }
00945 
00946     ary[0] = regAddr;
00947     iface->write(i2c_writeAddr, ary, 1, true);
00948     iface->read(i2c_readAddr, ary, 1, false);
00949 
00950     return ary[0];
00951 }
00952 
00953 /* ==================================================================
00954  * <I2C>
00955  * レジスタの内容を読み取り(複数可)
00956  */
00957 char BNO055_I2C_CTRL::rrc(bool isPage1, char startRegAddr, char *receiveBytes, char length){
00958     //読み取りバイト数が1未満
00959     if(length < 1) return -1;
00960 
00961     //ページが異なるならページ変更命令を発行
00962     if(page1 != isPage1){
00963         ary[0] = BNO055_PAGE_ID;
00964         ary[1] = (isPage1) ? 1 : 0;
00965         page1 = isPage1;
00966         iface->write(i2c_writeAddr, ary, 2);
00967     }
00968 
00969     ary[0] = startRegAddr;
00970     iface->write(i2c_writeAddr, ary, 1, true);
00971     iface->read(i2c_readAddr, receiveBytes, length, false);
00972 
00973     return receiveBytes[0];
00974 }
00975 
00976 /* ==================================================================
00977  * <I2C>
00978  * レジスタ書き込み(1byteのみ)
00979  */
00980 char BNO055_I2C_CTRL::wr(bool isPage1, char regAddr, char wBytes){
00981     //ページが異なるならページ変更命令を発行
00982     if(page1 != isPage1){
00983         ary[0] = BNO055_PAGE_ID;
00984         ary[1] = (isPage1) ? 1 : 0;
00985         page1 = isPage1;
00986         iface->write(i2c_writeAddr, ary, 2);
00987     }
00988 
00989     ary[0] = regAddr;
00990     ary[1] = wBytes;
00991 
00992     iface->write(i2c_writeAddr, ary, 2);
00993 
00994     return ary[0];
00995 }
00996 
00997 /* ==================================================================
00998  * <I2C>
00999  * レジスタ書き込み(複数可)
01000  */
01001 char BNO055_I2C_CTRL::wrc(bool isPage1, char startRegAddr, char *Bytes, char length){
01002     //書き込みバイト数が1未満
01003     if(length < 1) return -1;
01004 
01005     //ページが異なるならページ変更命令を発行
01006     if(page1 != isPage1){
01007         ary[0] = BNO055_PAGE_ID;
01008         ary[1] = (isPage1) ? 1 : 0;
01009         page1 = isPage1;
01010         iface->write(i2c_writeAddr, ary, 2);
01011     }
01012 
01013     ary[0] = startRegAddr;
01014     iface->write(i2c_writeAddr, ary, 1, true);
01015     iface->write(i2c_writeAddr, Bytes, length, false);
01016 
01017     return Bytes[0];
01018 }
01019 
01020 /* ==================================================================
01021  * <I2C>
01022  * インターフェース設定を初期化する
01023  */
01024 void BNO055_I2C_CTRL::init(){
01025     iface->frequency(i2c_freq);
01026     wait_ms(5);
01027 }
01028 
01029 
01030 
01031 
01032 
01033 
01034 
01035 
01036 
01037 //CLASS:BOARDC_BNO055////////////////////////////////////////////////
01038 /* ------------------------------------------------------------------
01039  * メインクラス
01040  * BNO055をUARTまたはI2Cで使用するための命令をまとめている
01041  * 内部にBNO055_CTRLクラスのインスタンスを持ち、コンストラクタの引数によって
01042  * UARTとI2Cのどちらを使用するか決定する
01043  */
01044 
01045 /* ==================================================================
01046  * コンストラクタ (オーバーロード+3)
01047  * UARTで使用する際のコンストラクタ:ピン別名を指定する
01048  */
01049 BOARDC_BNO055::BOARDC_BNO055(PinName tx, PinName rx){
01050     ctrl = new BNO055_UART_CTRL(new RawSerial(tx, rx));
01051 
01052     scaleACC = 0.01f; // = 1 / 100
01053     scaleMAG = 0.0625f; // = 1 / 16
01054     scaleGYRO = 0.0625f; // = 1 / 16
01055     scaleEuler = 0.0625f; // = 1 / 16
01056     scaleTEMP = 1.0f;
01057     scaleLIA = scaleACC;
01058     scaleGV = scaleACC;
01059     scaleQuaternion = 0.00006103515; // = 1 / (2^14)
01060 
01061     clkExt = false;
01062 }
01063 
01064 /* ==================================================================
01065  * コンストラクタ (オーバーロード+3)
01066  * UARTで使用する際のコンストラクタ:RawSerialクラスのインスタンスを指定する
01067  */
01068 BOARDC_BNO055::BOARDC_BNO055(RawSerial *uart){
01069     ctrl = new BNO055_UART_CTRL(uart);
01070 
01071     scaleACC = 0.01f; // = 1 / 100
01072     scaleMAG = 0.0625f; // = 1 / 16
01073     scaleGYRO = 0.0625f; // = 1 / 16
01074     scaleEuler = 0.0625f; // = 1 / 16
01075     scaleTEMP = 1.0f;
01076     scaleLIA = scaleACC;
01077     scaleGV = scaleACC;
01078     scaleQuaternion = 0.00006103515; // = 1 / (2^14)
01079 
01080     clkExt = false;
01081 }
01082 
01083 /* ==================================================================
01084  * コンストラクタ (オーバーロード+3)
01085  * I2Cで使用する際のコンストラクタ:ピン別名を指定する
01086  */
01087 BOARDC_BNO055::BOARDC_BNO055(PinName sda, PinName scl, char addr, unsigned int freq){
01088     ctrl = new BNO055_I2C_CTRL(new I2C(sda, scl), addr, freq);
01089 
01090     scaleACC = 0.01f; // = 1 / 100
01091     scaleMAG = 0.0625f; // = 1 / 16
01092     scaleGYRO = 0.0625f; // = 1 / 16
01093     scaleEuler = 0.0625f; // = 1 / 16
01094     scaleTEMP = 1.0f;
01095     scaleLIA = scaleACC;
01096     scaleGV = scaleACC;
01097     scaleQuaternion = 0.00006103515; // = 1 / (2^14)
01098 
01099     clkExt = false;
01100 }
01101 
01102 /* ==================================================================
01103  * コンストラクタ (オーバーロード+3)
01104  * I2Cで使用する際のコンストラクタ:I2Cクラスのインスタンスを指定する
01105  */
01106 BOARDC_BNO055::BOARDC_BNO055(I2C* iic, char addr, unsigned int freq){
01107     ctrl = new BNO055_I2C_CTRL(iic, addr, freq);
01108 
01109     scaleACC = 0.01f; // = 1 / 100
01110     scaleMAG = 0.0625f; // = 1 / 16
01111     scaleGYRO = 0.0625f; // = 1 / 16
01112     scaleEuler = 0.0625f; // = 1 / 16
01113     scaleTEMP = 1.0f;
01114     scaleLIA = scaleACC;
01115     scaleGV = scaleACC;
01116     scaleQuaternion = 0.00006103515; // = 1 / (2^14)
01117 
01118     clkExt = false;
01119 }
01120 
01121 /* ==================================================================
01122  * デストラクタ
01123  */
01124 BOARDC_BNO055::~BOARDC_BNO055(){
01125     delete ctrl;
01126 }
01127 
01128 /* ==================================================================
01129  * デフォルト設定での初期化
01130  */
01131 char BOARDC_BNO055::initialize(bool resetIface){
01132     if(resetIface) ctrl->init();
01133 
01134     //CONFIGモードに設定
01135     setOperation_CONFIG();
01136 
01137     //外部発振子設定,セルフテストの実行,セルフテスト完了まで待つ
01138     setSysTrigger(0x81);
01139 
01140     //加速度センサーレンジ設定(+-8G)
01141     //地磁気や角速度センサーのレンジやバンドはFusionモードにより自動設定される
01142     if(!setAccRange(16)) return -1;
01143 
01144     //各軸リマップ設定(BNO055の1pinマークが表側右下)
01145     if(!setAxisRemap_topview_bottomright()) return -2;
01146 
01147     //単位系セット
01148     //ORI_Android_Windows : Windows
01149     //TEMP_Unit : Celcius
01150     //EUL_Unit : Degree
01151     //GYR_Unit : deg/s
01152     //ACC_Unit : m/s^2
01153     if(!setUNIT_SEL(0x00)) return -3;
01154 
01155     //動作モード設定(9軸Fusionモード)
01156     if(!setOperation_Fusion_NDOF()) return -4;
01157 
01158     return 0;
01159 }
01160 
01161 /* ==================================================================
01162  * 通信で発生した最後のエラー番号を返す
01163  */
01164 char BOARDC_BNO055::getIfaceLastError(){
01165     return ctrl->getLastError();
01166 }
01167 
01168 /* ==================================================================
01169  * 通信で発生した最後のエラーの通信バイト数を返す
01170  */
01171 char BOARDC_BNO055::getIfaceLastLength(){
01172     return ctrl->getLastLength();
01173 }
01174 
01175 /* ==================================================================
01176  * ユーザー定義読み取り(1byte)
01177  * レジスタを指定して値を直接読み取る
01178  */
01179 char BOARDC_BNO055::customRead(bool isPage1, char regAddr){
01180     return ctrl->rr(isPage1, regAddr);
01181 }
01182 
01183 /* ==================================================================
01184  * ユーザー定義読み取り(連続)
01185  * レジスタを指定して値を直接読み取る
01186  */
01187 char BOARDC_BNO055::customReadC(bool isPage1, char startRegAddr, char *receiveBytes, unsigned char length){
01188     return ctrl->rrc(isPage1, startRegAddr, receiveBytes, length);
01189 }
01190 
01191 /* ==================================================================
01192  * ユーザー定義書き込み(1byte)
01193  * レジスタを指定して値を直接書き込む
01194  */
01195 char BOARDC_BNO055::customWrite(bool isPage1, char regAddr, char wBytes){
01196     return ctrl->wr(isPage1, regAddr, wBytes);
01197 }
01198 
01199 /* ==================================================================
01200  * ユーザー定義書き込み(連続)
01201  * レジスタを指定して値を直接書き込む
01202  */
01203 char BOARDC_BNO055::customWriteC(bool isPage1, char startRegAddr, char *Bytes, unsigned char length){
01204     return ctrl->wrc(isPage1, startRegAddr, Bytes, length);
01205 }
01206 
01207 /* ==================================================================
01208  * レジスタ:ページIDの現在値を読む
01209  * 実際はコントロールクラスが保持している内部変数の値を返しているだけ
01210  */
01211 char BOARDC_BNO055::getPage(){
01212     return ctrl->getNowPage();
01213 }
01214 
01215 /* ==================================================================
01216  * レジスタ:ページIDを変更する
01217  * ページIDが現在値と同じであれば何もしない
01218  */
01219 void BOARDC_BNO055::setPage(unsigned char pageNo){
01220     pageNo = (pageNo == 0) ? 0 : 1;
01221     if(getPage() == pageNo) return;
01222     ctrl->wr((getPage() == 0) ? true : false, BNO055_PAGE_ID, pageNo);
01223 }
01224 
01225 /* ==================================================================
01226  * レジスタ:チップIDの値を取得する
01227  */
01228 char BOARDC_BNO055::getChipID(){
01229     return ctrl->rr(0, BNO055P0_CHIP_ID);
01230 }
01231 
01232 /* ==================================================================
01233  * レジスタ:加速度センサーIDの値を取得する
01234  */
01235 char BOARDC_BNO055::getAccChipID(){
01236     return ctrl->rr(0, BNO055P0_ACC_ID);
01237 }
01238 
01239 /* ==================================================================
01240  * レジスタ:地磁気センサーIDの値を取得する
01241  */
01242 char BOARDC_BNO055::getMagChipID(){
01243     return ctrl->rr(0, BNO055P0_MAG_ID);
01244 }
01245 
01246 /* ==================================================================
01247  * レジスタ:ジャイロセンサーIDの値を取得する
01248  */
01249 char BOARDC_BNO055::getGyroChipID(){
01250     return ctrl->rr(0, BNO055P0_GYR_ID);
01251 }
01252 
01253 /* ==================================================================
01254  * レジスタ:内部ソフトウェアリビジョンの値を取得する
01255  */
01256 short BOARDC_BNO055::getRevision(){
01257     //連続2byte読み取り
01258     char rsv[2];
01259     ctrl->rrc(0, BNO055P0_SW_REV_ID_LSB, rsv, 2);
01260 
01261     return (rsv[1] << 8) | rsv[0];
01262 }
01263 
01264 /* ==================================================================
01265  * レジスタ:内部ブートリビジョンの値を取得する
01266  */
01267 char BOARDC_BNO055::getBootRevision(){
01268     return ctrl->rr(0, BNO055P0_BL_REV_ID);
01269 }
01270 
01271 /* ==================================================================
01272  * 加速度センサーのRAW値に乗算する係数を取得する
01273  */
01274 float BOARDC_BNO055::getAccScale(){
01275     return scaleACC;
01276 }
01277 
01278 /* ==================================================================
01279  * 地磁気センサーのRAW値に乗算する係数を取得する
01280  */
01281 float BOARDC_BNO055::getMagScale(){
01282     return scaleMAG;
01283 }
01284 
01285 /* ==================================================================
01286  * 角速度センサーのRAW値に乗算する係数を取得する
01287  */
01288 float BOARDC_BNO055::getGyroScale(){
01289     return scaleGYRO;
01290 }
01291 
01292 /* ==================================================================
01293  * 温度センサーのRAW値に乗算する係数を取得する
01294  */
01295 float BOARDC_BNO055::getTempScale(){
01296     return scaleTEMP;
01297 }
01298 
01299 /* ==================================================================
01300  * オイラー角のRAW値に乗算する係数を取得する
01301  */
01302 float BOARDC_BNO055::getEulerScale(){
01303     return scaleEuler;
01304 }
01305 
01306 /* ==================================================================
01307  * 加速度センサーの線形加速度のRAW値に乗算する係数を取得する
01308  */
01309 float BOARDC_BNO055::getLinearScale(){
01310     return scaleLIA;
01311 }
01312 
01313 /* ==================================================================
01314  * 重力ベクトルのRAW値に乗算する係数を取得する
01315  */
01316 float BOARDC_BNO055::getGVScale(){
01317     return scaleGV;
01318 }
01319 
01320 /* ==================================================================
01321  * 四元数のRAW値に乗算する係数を取得する
01322  */
01323 double BOARDC_BNO055::getQuaternionScale(){
01324     return scaleQuaternion;
01325 }
01326 
01327 
01328 /* ==================================================================
01329  * 加速度センサの値を取得する
01330  * ------------------------------------------------------------------
01331  * &accX: アドレス参照引数:関数実行後、この変数にX軸の値が格納される
01332  * &accY: アドレス参照引数:関数実行後、この変数にY軸の値が格納される
01333  * &accZ: アドレス参照引数:関数実行後、この変数にZ軸の値が格納される
01334  */
01335 void BOARDC_BNO055::getAccDataAll(short &accX, short &accY, short &accZ){
01336     //連続6byte読み取り
01337     char rsv[6];
01338     ctrl->rrc(0, BNO055P0_ACC_DATA_X_LSB, rsv, 6);
01339 
01340     accX = (rsv[1] << 8) | rsv[0];
01341     accY = (rsv[3] << 8) | rsv[2];
01342     accZ = (rsv[5] << 8) | rsv[4];
01343 }
01344 
01345 /* ==================================================================
01346  * 加速度センサの値(X軸のみ)を取得する
01347  */
01348 short BOARDC_BNO055::getAccDataX(){
01349     //連続2byte読み取り
01350     char rsv[2];
01351     ctrl->rrc(0, BNO055P0_ACC_DATA_X_LSB, rsv, 2);
01352 
01353     return (rsv[1] << 8) | rsv[0];
01354 }
01355 
01356 /* ==================================================================
01357  * 加速度センサの値(Y軸のみ)を取得する
01358  */
01359 short BOARDC_BNO055::getAccDataY(){
01360     //連続2byte読み取り
01361     char rsv[2];
01362     ctrl->rrc(0, BNO055P0_ACC_DATA_Y_LSB, rsv, 2);
01363 
01364     return (rsv[1] << 8) | rsv[0];
01365 }
01366 
01367 /* ==================================================================
01368  * 加速度センサの値(Z軸のみ)を取得する
01369  */
01370 short BOARDC_BNO055::getAccDataZ(){
01371     //連続2byte読み取り
01372     char rsv[2];
01373     ctrl->rrc(0, BNO055P0_ACC_DATA_Z_LSB, rsv, 2);
01374 
01375     return (rsv[1] << 8) | rsv[0];
01376 }
01377 
01378 /* ==================================================================
01379  * 地磁気センサの値を取得する
01380  * ------------------------------------------------------------------
01381  * &magX: アドレス参照引数:関数実行後、この変数にX軸の値が格納される
01382  * &magY: アドレス参照引数:関数実行後、この変数にY軸の値が格納される
01383  * &magZ: アドレス参照引数:関数実行後、この変数にZ軸の値が格納される
01384  */
01385 void BOARDC_BNO055::getMagDataAll(short &magX, short &magY, short &magZ){
01386     //連続6byte読み取り
01387     char rsv[6];
01388     ctrl->rrc(0, BNO055P0_MAG_DATA_X_LSB, rsv, 6);
01389 
01390     magX = (rsv[1] << 8) | rsv[0];
01391     magY = (rsv[3] << 8) | rsv[2];
01392     magZ = (rsv[5] << 8) | rsv[4];
01393 }
01394 
01395 /* ==================================================================
01396  * 地磁気センサの値(X軸のみ)を取得する
01397  */
01398 short BOARDC_BNO055::getMagDataX(){
01399     //連続2byte読み取り
01400     char rsv[2];
01401     ctrl->rrc(0, BNO055P0_MAG_DATA_X_LSB, rsv, 2);
01402 
01403     return (rsv[1] << 8) | rsv[0];
01404 }
01405 
01406 /* ==================================================================
01407  * 地磁気センサの値(Y軸のみ)を取得する
01408  */
01409 short BOARDC_BNO055::getMagDataY(){
01410     //連続2byte読み取り
01411     char rsv[2];
01412     ctrl->rrc(0, BNO055P0_MAG_DATA_Y_LSB, rsv, 2);
01413 
01414     return (rsv[1] << 8) | rsv[0];
01415 }
01416 
01417 /* ==================================================================
01418  * 地磁気センサの値(Z軸のみ)を取得する
01419  */
01420 short BOARDC_BNO055::getMagDataZ(){
01421     //連続2byte読み取り
01422     char rsv[2];
01423     ctrl->rrc(0, BNO055P0_MAG_DATA_Z_LSB, rsv, 2);
01424 
01425     return (rsv[1] << 8) | rsv[0];
01426 }
01427 
01428 /* ==================================================================
01429  * ジャイロセンサの値を取得する
01430  * ------------------------------------------------------------------
01431  * &gyroX: アドレス参照引数:関数実行後、この変数にX軸の値が格納される
01432  * &gyroY: アドレス参照引数:関数実行後、この変数にY軸の値が格納される
01433  * &gyroZ: アドレス参照引数:関数実行後、この変数にZ軸の値が格納される
01434  */
01435 void BOARDC_BNO055::getGyroDataAll(short &gyroX, short &gyroY, short &gyroZ){
01436     //連続6byte読み取り
01437     char rsv[6];
01438     ctrl->rrc(0, BNO055P0_GYR_DATA_X_LSB, rsv, 6);
01439 
01440     gyroX = (rsv[1] << 8) | rsv[0];
01441     gyroY = (rsv[3] << 8) | rsv[2];
01442     gyroZ = (rsv[5] << 8) | rsv[4];
01443 }
01444 
01445 /* ==================================================================
01446  * ジャイロセンサの値(X軸のみ)を取得する
01447  */
01448 short BOARDC_BNO055::getGyroDataX(){
01449     //連続2byte読み取り
01450     char rsv[2];
01451     ctrl->rrc(0, BNO055P0_GYR_DATA_X_LSB, rsv, 2);
01452 
01453     return (rsv[1] << 8) | rsv[0];
01454 }
01455 
01456 /* ==================================================================
01457  * ジャイロセンサの値(Y軸のみ)を取得する
01458  */
01459 short BOARDC_BNO055::getGyroDataY(){
01460     //連続2byte読み取り
01461     char rsv[2];
01462     ctrl->rrc(0, BNO055P0_GYR_DATA_Y_LSB, rsv, 2);
01463 
01464     return (rsv[1] << 8) | rsv[0];
01465 }
01466 
01467 /* ==================================================================
01468  * ジャイロセンサの値(Z軸のみ)を取得する
01469  */
01470 short BOARDC_BNO055::getGyroDataZ(){
01471     //連続2byte読み取り
01472     char rsv[2];
01473     ctrl->rrc(0, BNO055P0_GYR_DATA_Z_LSB, rsv, 2);
01474 
01475     return (rsv[1] << 8) | rsv[0];
01476 }
01477 
01478 /* ==================================================================
01479  * FusionSensing:オイラー角の値を取得する
01480  * FusionSensing機能(内部演算機能)を使用していない場合は不定の値を返す
01481  * ------------------------------------------------------------------
01482  * &E_heading: アドレス参照引数:関数実行後、この変数にYaw軸(heading)の値が格納される
01483  * &E_roll: アドレス参照引数:関数実行後、この変数にroll軸の値が格納される
01484  * &E_pitch: アドレス参照引数:関数実行後、この変数にpitch軸の値が格納される
01485  */
01486 void BOARDC_BNO055::getEulerDataAll(short &E_heading, short &E_roll, short &E_pitch){
01487     //連続6byte読み取り
01488     char rsv[6];
01489     ctrl->rrc(0, BNO055P0_EUL_HEADING_LSB, rsv, 6);
01490 
01491     E_heading = (rsv[1] << 8) | rsv[0];
01492     E_roll = (rsv[3] << 8) | rsv[2];
01493     E_pitch = (rsv[5] << 8) | rsv[4];
01494 }
01495 
01496 /* ==================================================================
01497  * FusionSensing:オイラー角の値(Yaw軸(heading)のみ)を取得する
01498  * FusionSensing機能(内部演算機能)を使用していない場合は不定の値を返す
01499  */
01500 short BOARDC_BNO055::getEulerDataHeading(){
01501     //連続2byte読み取り
01502     char rsv[2];
01503     ctrl->rrc(0, BNO055P0_EUL_HEADING_LSB, rsv, 2);
01504 
01505     return (rsv[1] << 8) | rsv[0];
01506 }
01507 
01508 /* ==================================================================
01509  * getEulerDataHeading()のエイリアス
01510  * FusionSensing:オイラー角の値(Yaw軸(heading)のみ)を返す
01511  */
01512 short BOARDC_BNO055::getEulerDataYaw(){
01513     return getEulerDataHeading();
01514 }
01515 
01516 /* ==================================================================
01517  * FusionSensing:オイラー角の値(pitch軸のみ)を取得する
01518  * FusionSensing機能(内部演算機能)を使用していない場合は不定の値を返す
01519  */
01520 short BOARDC_BNO055::getEulerDataRoll(){
01521     //連続2byte読み取り
01522     char rsv[2];
01523     ctrl->rrc(0, BNO055P0_EUL_ROLL_LSB, rsv, 2);
01524 
01525     return (rsv[1] << 8) | rsv[0];
01526 }
01527 
01528 /* ==================================================================
01529  * FusionSensing:オイラー角の値(pitch軸のみ)を取得する
01530  * FusionSensing機能(内部演算機能)を使用していない場合は不定の値を返す
01531  */
01532 short BOARDC_BNO055::getEulerDataPitch(){
01533     //連続2byte読み取り
01534     char rsv[2];
01535     ctrl->rrc(0, BNO055P0_EUL_PITCH_LSB, rsv, 2);
01536 
01537     return (rsv[1] << 8) | rsv[0];
01538 }
01539 
01540 /* ==================================================================
01541  * FusionSensing:9軸センサーのすべての値の値を取得する
01542  */
01543 void BOARDC_BNO055::get9Axis(short *box){
01544     char rsv[18];
01545     ctrl->rrc(0, BNO055P0_ACC_DATA_X_LSB, rsv, 18);
01546 
01547     box[0] = (rsv[1] << 8) | rsv[0];
01548     box[1] = (rsv[3] << 8) | rsv[2];
01549     box[2] = (rsv[5] << 8) | rsv[4];
01550     box[3] = (rsv[7] << 8) | rsv[6];
01551     box[4] = (rsv[9] << 8) | rsv[8];
01552     box[5] = (rsv[11] << 8) | rsv[10];
01553     box[6] = (rsv[13] << 8) | rsv[12];
01554     box[7] = (rsv[15] << 8) | rsv[14];
01555     box[8] = (rsv[17] << 8) | rsv[16];
01556 }
01557 
01558 /* ==================================================================
01559  * FusionSensing:9軸センサーのすべての値とオイラー角のすべての値を取得する
01560  * FusionSensing機能(内部演算機能)を使用していない場合は不定の値を返す
01561  */
01562 void BOARDC_BNO055::get9AxisAndEUL(short *box){
01563     char rsv[24];
01564     ctrl->rrc(0, BNO055P0_ACC_DATA_X_LSB, rsv, 24);
01565 
01566     box[0] = (rsv[1] << 8) | rsv[0];
01567     box[1] = (rsv[3] << 8) | rsv[2];
01568     box[2] = (rsv[5] << 8) | rsv[4];
01569     box[3] = (rsv[7] << 8) | rsv[6];
01570     box[4] = (rsv[9] << 8) | rsv[8];
01571     box[5] = (rsv[11] << 8) | rsv[10];
01572     box[6] = (rsv[13] << 8) | rsv[12];
01573     box[7] = (rsv[15] << 8) | rsv[14];
01574     box[8] = (rsv[17] << 8) | rsv[16];
01575     box[9] = (rsv[19] << 8) | rsv[18];
01576     box[10] = (rsv[21] << 8) | rsv[20];
01577     box[11] = (rsv[23] << 8) | rsv[22];
01578 }
01579 
01580 /* ==================================================================
01581  * FusionSensing:四元数(Quaternion)を取得する
01582  * FusionSensing機能(内部演算機能)を使用していない場合は不定の値を返す
01583  * ------------------------------------------------------------------
01584  * &q1, &q2, &q3, &q4:アドレス参照引数:関数実行後、この変数に四元数が格納される
01585  */
01586 void BOARDC_BNO055::getQuaternion(short &q1, short &q2, short &q3, short &q4){
01587     //連続8byte読み取り
01588     char rsv[8];
01589     ctrl->rrc(0, BNO055P0_QUA_DATA_W_LSB, rsv, 8);
01590 
01591     q1 = (rsv[1] << 8) | rsv[0];
01592     q2 = (rsv[3] << 8) | rsv[2];
01593     q3 = (rsv[5] << 8) | rsv[4];
01594     q4 = (rsv[7] << 8) | rsv[6];
01595 }
01596 
01597 /* ==================================================================
01598  * 線形加速度(LinearAcceleration)での加速度センサの値を取得する
01599  * ------------------------------------------------------------------
01600  * &L_accX: アドレス参照引数:関数実行後、この変数にX軸の値が格納される
01601  * &L_accY: アドレス参照引数:関数実行後、この変数にY軸の値が格納される
01602  * &L_accZ: アドレス参照引数:関数実行後、この変数にZ軸の値が格納される
01603  */
01604 void BOARDC_BNO055::getLinearAccDataAll(short &L_accX, short &L_accY, short &L_accZ){
01605     //連続6byte読み取り
01606     char rsv[6];
01607     ctrl->rrc(0, BNO055P0_LIA_DATA_X_LSB, rsv, 6);
01608 
01609     L_accX = (rsv[1] << 8) | rsv[0];
01610     L_accY = (rsv[3] << 8) | rsv[2];
01611     L_accZ = (rsv[5] << 8) | rsv[4];
01612 }
01613 
01614 /* ==================================================================
01615  * 線形加速度(LinearAcceleration)での加速度センサの値(X軸のみ)を取得する
01616  */
01617 short BOARDC_BNO055::getLinearAccDataX(){
01618     //連続2byte読み取り
01619     char rsv[2];
01620     ctrl->rrc(0, BNO055P0_LIA_DATA_X_LSB, rsv, 2);
01621 
01622     return (rsv[1] << 8) | rsv[0];
01623 }
01624 
01625 /* ==================================================================
01626  * 線形加速度(LinearAcceleration)での加速度センサの値(Y軸のみ)を取得する
01627  */
01628 short BOARDC_BNO055::getLinearAccDataY(){
01629     //連続2byte読み取り
01630     char rsv[2];
01631     ctrl->rrc(0, BNO055P0_LIA_DATA_Y_LSB, rsv, 2);
01632 
01633     return (rsv[1] << 8) | rsv[0];
01634 }
01635 
01636 /* ==================================================================
01637  * 線形加速度(LinearAcceleration)での加速度センサの値(Z軸のみ)を取得する
01638  */
01639 short BOARDC_BNO055::getLinearAccDataZ(){
01640     //連続2byte読み取り
01641     char rsv[2];
01642     ctrl->rrc(0, BNO055P0_LIA_DATA_Z_LSB, rsv, 2);
01643 
01644     return (rsv[1] << 8) | rsv[0];
01645 }
01646 
01647 /* ==================================================================
01648  * 重力ベクトル情報を取得する
01649  * ------------------------------------------------------------------
01650  * &gvX: アドレス参照引数:関数実行後、この変数にX軸の値が格納される
01651  * &gvY: アドレス参照引数:関数実行後、この変数にY軸の値が格納される
01652  * &gvZ: アドレス参照引数:関数実行後、この変数にZ軸の値が格納される
01653  */
01654 void BOARDC_BNO055::getGVectorDataAll(short &gvX, short &gvY, short &gvZ){
01655     //連続6byte読み取り
01656     char rsv[6];
01657     ctrl->rrc(0, BNO055P0_GRV_DATA_X_LSB, rsv, 6);
01658 
01659     gvX = (rsv[1] << 8) | rsv[0];
01660     gvY = (rsv[3] << 8) | rsv[2];
01661     gvZ = (rsv[5] << 8) | rsv[4];
01662 }
01663 
01664 /* ==================================================================
01665  * 重力ベクトル情報(X軸のみ)を取得する
01666  */
01667 short BOARDC_BNO055::getGVectorDataX(){
01668     //連続2byte読み取り
01669     char rsv[2];
01670     ctrl->rrc(0, BNO055P0_GRV_DATA_X_LSB, rsv, 2);
01671 
01672     return (rsv[1] << 8) | rsv[0];
01673 }
01674 
01675 /* ==================================================================
01676  * 重力ベクトル情報(Y軸のみ)を取得する
01677  */
01678 short BOARDC_BNO055::getGVectorDataY(){
01679     //連続2byte読み取り
01680     char rsv[2];
01681     ctrl->rrc(0, BNO055P0_GRV_DATA_Y_LSB, rsv, 2);
01682 
01683     return (rsv[1] << 8) | rsv[0];
01684 }
01685 
01686 /* ==================================================================
01687  * 重力ベクトル情報(Z軸のみ)を取得する
01688  */
01689 short BOARDC_BNO055::getGVectorDataZ(){
01690     //連続2byte読み取り
01691     char rsv[2];
01692     ctrl->rrc(0, BNO055P0_GRV_DATA_Z_LSB, rsv, 2);
01693 
01694     return (rsv[1] << 8) | rsv[0];
01695 }
01696 
01697 /* ==================================================================
01698  * センサー内部温度情報を取得する
01699  * 内部温度のセンサーは2つあり、どちらか一方のみの温度を返す
01700  * (設定レジスタTEMP_SOURCEにて選択可)
01701  * (setTempSource(bool)にて選択可)
01702  */
01703 char BOARDC_BNO055::getTemperature(){
01704     return ctrl->rr(0, BNO055P0_TEMP);
01705 }
01706 
01707 /* ==================================================================
01708  * キャリブレーション(補正)の状態を取得する
01709  * ------------------------------------------------------------------
01710  * &sys: アドレス参照引数:関数実行後、この変数にsystem補正の状態が格納される
01711  * &acc: アドレス参照引数:関数実行後、この変数に加速度センサー補正の状態が格納される
01712  * &mag: アドレス参照引数:関数実行後、この変数に地磁気センサー補正の状態が格納される
01713  * &gyro: アドレス参照引数:関数実行後、この変数に角速度センサー補正の状態が格納される
01714  * ------------------------------------------------------------------
01715  * 各補正情報は0 - 100[%]の百分率で返答される。それぞれ2bitであるため
01716  * 値は0[%],32[%],66[%],100[%]のいずれか
01717  */
01718 void BOARDC_BNO055::getCalibStatusAll(char &sys, char &acc, char &mag, char &gyro){
01719     char rv = ctrl->rr(0, BNO055P0_CALIB_STAT);
01720     sys = (((rv & 0xC0) >> 6) * 34);
01721     gyro = (((rv & 0x30) >> 4) * 34);
01722     acc = (((rv & 0x0C) >> 2) * 34);
01723     mag = ((rv & 0x03) * 34);
01724     sys -= (sys == 0) ? 0 : 2;
01725     gyro -= (gyro == 0) ? 0 : 2;
01726     acc -= (acc == 0) ? 0 : 2;
01727     mag -= (mag == 0) ? 0 : 2;
01728 }
01729 
01730 /* ==================================================================
01731  * キャリブレーション(補正)の状態(systemのみ)を取得する
01732  * ------------------------------------------------------------------
01733  * 各補正情報は0 - 100[%]の百分率で返答される。それぞれ2bitであるため
01734  * 値は0[%],32[%],66[%],100[%]のいずれか
01735  */
01736 char BOARDC_BNO055::getCalibStatusSys(){
01737     char ret = (((ctrl->rr(0, BNO055P0_CALIB_STAT) & 0xC0) >> 6) * 34) - 2;
01738     return (ret < 0) ? 0 : ret;
01739 }
01740 
01741 /* ==================================================================
01742  * キャリブレーション(補正)の状態(加速度センサーのみ)を取得する
01743  * ------------------------------------------------------------------
01744  * 各補正情報は0 - 100[%]の百分率で返答される。それぞれ2bitであるため
01745  * 値は0[%],32[%],66[%],100[%]のいずれか
01746  */
01747 char BOARDC_BNO055::getCalibStatusAcc(){
01748     char ret = (((ctrl->rr(0, BNO055P0_CALIB_STAT) & 0x0C) >> 2) * 34) - 2;
01749     return (ret < 0) ? 0 : ret;
01750 }
01751 
01752 /* ==================================================================
01753  * キャリブレーション(補正)の状態(地磁気センサーのみ)を取得する
01754  * ------------------------------------------------------------------
01755  * 各補正情報は0 - 100[%]の百分率で返答される。それぞれ2bitであるため
01756  * 値は0[%],32[%],66[%],100[%]のいずれか
01757  */
01758 char BOARDC_BNO055::getCalibStatusMag(){
01759     char ret = ((ctrl->rr(0, BNO055P0_CALIB_STAT) & 0x03) * 34) - 2;
01760     return (ret < 0) ? 0 : ret;
01761 }
01762 
01763 /* ==================================================================
01764  * キャリブレーション(補正)の状態(角速度センサーのみ)を取得する
01765  * ------------------------------------------------------------------
01766  * 各補正情報は0 - 100[%]の百分率で返答される。それぞれ2bitであるため
01767  * 値は0[%],32[%],66[%],100[%]のいずれか
01768  */
01769 char BOARDC_BNO055::getCalibStatusGyro(){
01770     char ret = (((ctrl->rr(0, BNO055P0_CALIB_STAT) & 0x30) >> 4) * 34) - 2;
01771     return (ret < 0) ? 0 : ret;
01772 }
01773 
01774 /* ==================================================================
01775  * システムおよびセンサーのセルフテストの実行結果を取得する
01776  * ------------------------------------------------------------------
01777  * returns:
01778  * 1bit目:加速度センサーのセルフテストの実行結果(0:failed(異常), 1:passed(正常))
01779  * 2bit目:地磁気センサーのセルフテストの実行結果(0:failed(異常), 1:passed(正常))
01780  * 3bit目:角速度センサーのセルフテストの実行結果(0:failed(異常), 1:passed(正常))
01781  * 4bit目:内部マイコンのセルフテストの実行結果(0:failed(異常), 1:passed(正常))
01782  * ------------------------------------------------------------------
01783  * 例:戻り値 0x0D (0b00001101)
01784  * >>加速度センサー:正常(1)
01785  * >>地磁気センサー:異常(0)
01786  * >>角速度センサー:正常(1)
01787  * >>内部マイコン:正常(1)
01788  */
01789 char BOARDC_BNO055::getSelfTestResultAll(){
01790     return ctrl->rr(0, BNO055P0_ST_RESULT);
01791 }
01792 
01793 /* ==================================================================
01794  * 内部マイコン(BNO055のMCU)のセルフテストの実行結果を取得する
01795  * ------------------------------------------------------------------
01796  * returns:
01797  * false:failed(異常)
01798  * true:passed(正常)
01799  */
01800 bool BOARDC_BNO055::getSelfTestResultMCU(){
01801     return (((ctrl->rr(0, BNO055P0_ST_RESULT) & 0x08) >> 3) == 1);
01802 }
01803 
01804 /* ==================================================================
01805  * 加速度センサーのセルフテストの実行結果を取得する
01806  * ------------------------------------------------------------------
01807  * returns:
01808  * false:failed(異常)
01809  * true:passed(正常)
01810  */
01811 bool BOARDC_BNO055::getSelfTestResultAcc(){
01812     return ((ctrl->rr(0, BNO055P0_ST_RESULT) & 0x01) == 1);
01813 }
01814 
01815 /* ==================================================================
01816  * 地磁気センサーのセルフテストの実行結果を取得する
01817  * ------------------------------------------------------------------
01818  * returns:
01819  * false:failed(異常)
01820  * true:passed(正常)
01821  */
01822 bool BOARDC_BNO055::getSelfTestResultMag(){
01823     return (((ctrl->rr(0, BNO055P0_ST_RESULT) & 0x02) >> 1) == 1);
01824 }
01825 
01826 /* ==================================================================
01827  * 地磁気センサーのセルフテストの実行結果を取得する
01828  * ------------------------------------------------------------------
01829  * returns:
01830  * false:failed(異常)
01831  * true:passed(正常)
01832  */
01833 bool BOARDC_BNO055::getSelfTestResultGyro(){
01834     return (((ctrl->rr(0, BNO055P0_ST_RESULT) & 0x04) >> 2) == 1);
01835 }
01836 
01837 /* ==================================================================
01838  * 発生している割り込みステータス情報を取得する
01839  * ------------------------------------------------------------------
01840  * returns:
01841  * 3bit目:GYRO_AM(角速度AnyMotion発生)(1:発生中, 0:なし)
01842  * 4bit目:GYR_HIGH_RATE(角速度ハイレート発生)(1:発生中, 0:なし)
01843  * 6bit目:ACC_HIGH_G(加速度急加速発生)(1:発生中, 0:なし)
01844  * 7bit目:ACC_AM(角速度AnyMotion発生)(1:発生中, 0:なし)
01845  * 8bit目:ACC_NM(角速度NoMotion発生)(1:発生中, 0:なし)
01846  */
01847 char BOARDC_BNO055::triggeredIntALL(){
01848     return ctrl->rr(0, BNO055P0_INT_STA);
01849 }
01850 
01851 /* ==================================================================
01852  * 発生している割り込みステータス情報(ACC_NM)を取得する
01853  * ------------------------------------------------------------------
01854  * returns:
01855  * true:ACC_NMトリガー発生中
01856  * false:ACC_NMトリガーなし
01857  */
01858 bool BOARDC_BNO055::triggeredACC_NM(){
01859     return (((ctrl->rr(0, BNO055P0_INT_STA) & 0x80) >> 7) == 1);
01860 }
01861 
01862 /* ==================================================================
01863  * 発生している割り込みステータス情報(ACC_AM)を取得する
01864  * ------------------------------------------------------------------
01865  * returns:
01866  * true:ACC_AMトリガー発生中
01867  * false:ACC_AMトリガーなし
01868  */
01869 bool BOARDC_BNO055::triggeredACC_AM(){
01870     return (((ctrl->rr(0, BNO055P0_INT_STA) & 0x40) >> 6) == 1);
01871 }
01872 
01873 /* ==================================================================
01874  * 発生している割り込みステータス情報(ACC_HIGH_G)を取得する
01875  * ------------------------------------------------------------------
01876  * returns:
01877  * true:ACC_HIGH_Gトリガー発生中
01878  * false:ACC_HIGH_Gトリガーなし
01879  */
01880 bool BOARDC_BNO055::triggeredACC_HIGH_G(){
01881     return (((ctrl->rr(0, BNO055P0_INT_STA) & 0x20) >> 5) == 1);
01882 }
01883 
01884 /* ==================================================================
01885  * 発生している割り込みステータス情報(GYR_HIGH_RATE)を取得する
01886  * ------------------------------------------------------------------
01887  * returns:
01888  * true:GYR_HIGH_RATEトリガー発生中
01889  * false:GYR_HIGH_RATEトリガーなし
01890  */
01891 bool BOARDC_BNO055::triggeredGYR_HIGH_RATE(){
01892     return (((ctrl->rr(0, BNO055P0_INT_STA) & 0x08) >> 3) == 1);
01893 }
01894 
01895 /* ==================================================================
01896  * 発生している割り込みステータス情報(GYRO_AM)を取得する
01897  * ------------------------------------------------------------------
01898  * returns:
01899  * true:GYRO_AMトリガー発生中
01900  * false:GYRO_AMトリガーなし
01901  */
01902 bool BOARDC_BNO055::triggeredGYRO_AM(){
01903     return (((ctrl->rr(0, BNO055P0_INT_STA) & 0x04) >> 2) == 1);
01904 }
01905 
01906 /* ==================================================================
01907  * BNO055のシステムクロック固定情報を取得する
01908  * ------------------------------------------------------------------
01909  * returns:
01910  * true:設定によって固定されている(SYS_TRIGGEレジスタのCLK_SEL)
01911  * false:設定されていない(内部か外部選択可)
01912  * ------------------------------------------------------------------
01913  * setSys_ExternalCrystal(bool)で設定可
01914  */
01915 bool BOARDC_BNO055::isSystemClockFixed(){
01916     return (ctrl->rr(0, BNO055P0_SYS_CLK_STATUS) == 1);
01917 }
01918 
01919 /* ==================================================================
01920  * BNO055のシステムステータスを取得する
01921  * ------------------------------------------------------------------
01922  * returns:
01923  * 0: システム待機状態
01924  * 1: システムエラー
01925  * 2: ペリフェラル初期化中
01926  * 3: システム初期化中
01927  * 4: セルフテスト実行中
01928  * 5: 起動中(Fusionアルゴリズム起動中)
01929  * 6: 起動中(Fusionアルゴリズムなし)
01930  */
01931 char BOARDC_BNO055::getSystemStatus(){
01932     return ctrl->rr(0, BNO055P0_SYS_STATUS);
01933 }
01934 
01935 /* ==================================================================
01936  * BNO055のシステムエラー情報を取得する
01937  * ------------------------------------------------------------------
01938  * returns:
01939  * 0: エラーなし
01940  * 1: ペリフェラル初期化エラー
01941  * 2: システム初期化エラー
01942  * 3: セルフテスト結果不調
01943  * 4: レジスタマップエラー(値の範囲外)
01944  * 5: レジスタマップエラー(アドレスの範囲外)
01945  * 6: レジスタマップエラー(書き込み不能)
01946  * 7: BNO005LowPowerモードにつき指定モード実行不可
01947  * 8: 加速度センサーPowerMode実行不可
01948  * 9: Fusionアルゴリズム設定エラー
01949  * 10: 各センサー設定エラー
01950  */
01951 char BOARDC_BNO055::getSystemError(){
01952     return ctrl->rr(0, BNO055P0_SYS_ERR);
01953 }
01954 
01955 /* ==================================================================
01956  * システムの設定単位系を取得する
01957  * ------------------------------------------------------------------
01958  * returns:
01959  * 1bit目: 加速度センサー単位系(0:m/s^2, 1:mg)
01960  * 2bit目: 角速度センサー単位系(0:deg/s, 1:rad/s)
01961  * 3bit目: オイラー角単位系(0:deg, 1:rad)
01962  * 5bit目: 温度単位系(0:摂氏, 1:華氏)
01963  * 7bit目: 出力設定(0:Windows, 1:Android)
01964  */
01965 char BOARDC_BNO055::getUNIT_SEL(){
01966     return ctrl->rr(0, BNO055P0_UNIT_SEL);
01967 }
01968 
01969 /* ==================================================================
01970  * システムの設定単位系を設定する
01971  * ------------------------------------------------------------------
01972  * 引数selectValue:
01973  * 1bit目: 加速度センサー単位系(0:m/s^2, 1:mg)
01974  * 2bit目: 角速度センサー単位系(0:deg/s, 1:rad/s)
01975  * 3bit目: オイラー角単位系(0:deg, 1:rad)
01976  * 5bit目: 温度単位系(0:摂氏, 1:華氏)
01977  * 7bit目: 出力設定(0:Windows, 1:Android)
01978  * returns:
01979  * -1           失敗
01980  * 1            成功
01981  */
01982 char BOARDC_BNO055::setUNIT_SEL(char selectValue){
01983     if(ctrl->wr(0, BNO055P0_UNIT_SEL, selectValue) == -1) return -1;
01984 
01985     scaleACC = ((selectValue & 0x01) == 0) ? 0.01f : 1.0f;
01986     scaleGYRO = ((selectValue & 0x02) == 0) ? 0.0625f : 0.001111111111f;
01987     scaleEuler = ((selectValue & 0x04) == 0) ? 0.0625f : 0.001111111111f;
01988     scaleTEMP = ((selectValue & 0x10) == 0) ? 1.0f : 2.0f;
01989     scaleLIA = scaleACC;
01990     scaleGV = scaleACC;
01991 
01992     return 1;
01993 }
01994 
01995 /* ==================================================================
01996  * システムの設定単位系(加速度センサー)を設定する
01997  * ------------------------------------------------------------------
01998  * 引数isMeterPerSec2:
01999  * true: m/s^2
02000  * false: mg
02001  * ------------------------------------------------------------------
02002  * returns:
02003  * -1           失敗
02004  * 1            成功
02005  */
02006 char BOARDC_BNO055::setUNIT_AccUnit(bool isMeterPerSec2){
02007     char val = getUNIT_SEL() & 0xFE;
02008     if(!isMeterPerSec2) val += 1;
02009     return setUNIT_SEL(val);
02010 }
02011 
02012 /* ==================================================================
02013  * システムの設定単位系(角速度センサー)を設定する
02014  * ------------------------------------------------------------------
02015  * 引数isDps:
02016  * true: dps(Degrees/s)
02017  * false: rps(Radians/s)
02018  * ------------------------------------------------------------------
02019  * returns:
02020  * -1           失敗
02021  * 1            成功
02022  */
02023 char BOARDC_BNO055::setUNIT_GyroUnit(bool isDps){
02024     char val = getUNIT_SEL() & 0xFD;
02025     if(!isDps) val += 2;
02026     return setUNIT_SEL(val);
02027 }
02028 
02029 /* ==================================================================
02030  * システムの設定単位系(オイラー角)を設定する
02031  * ------------------------------------------------------------------
02032  * 引数isDegrees:
02033  * true: Degrees
02034  * false: Radians
02035  * ------------------------------------------------------------------
02036  * returns:
02037  * -1           失敗
02038  * 1            成功
02039  */
02040 char BOARDC_BNO055::setUNIT_EulerUnit(bool isDegrees){
02041     char val = getUNIT_SEL() & 0xFB;
02042     if(!isDegrees) val += 4;
02043     return setUNIT_SEL(val);
02044 }
02045 
02046 /* ==================================================================
02047  * システムの設定単位系(温度)を設定する
02048  * ------------------------------------------------------------------
02049  * 引数isCelsius:
02050  * true: 摂氏(Celsius)
02051  * false: 華氏(Fahrenheit)
02052  * ------------------------------------------------------------------
02053  * returns:
02054  * -1           失敗
02055  * 1            成功
02056  */
02057 char BOARDC_BNO055::setUNIT_Temperature(bool isCelsius){
02058     char val = getUNIT_SEL() & 0xEF;
02059     if(!isCelsius) val += 16;
02060     return setUNIT_SEL(val);
02061 }
02062 
02063 /* ==================================================================
02064  * システムの設定単位系(出力設定)を設定する
02065  * ------------------------------------------------------------------
02066  * 引数ori_Android:
02067  * true: Android用(Pitch角:+180 to -180 反時計回り+)
02068  * false: Windows用(Pitch角:-180 to +180 時計回り+)
02069  * ------------------------------------------------------------------
02070  * returns:
02071  * -1           失敗
02072  * 1            成功
02073  */
02074 char BOARDC_BNO055::setUNIT_OrientationMode(bool ori_Android){
02075     char val = getUNIT_SEL() & 0xBF;
02076     if(!ori_Android) val += 64;
02077     return setUNIT_SEL(val);
02078 }
02079 
02080 /* ==================================================================
02081  * システムの動作モードを取得する
02082  * ------------------------------------------------------------------
02083  * returns:
02084  * 1            ACCONLY(NO FUSION)加速度のみ
02085  * 2            MAGONLY(NO FUSION)地磁気のみ
02086  * 3            GYROONLY(NO FUSION)角速度のみ
02087  * 4            ACCMAG(NO FUSION)加速度と地磁気
02088  * 5            ACCGYRO(NO FUSION)加速度と角速度
02089  * 6            MAGGYRO(NO FUSION)地磁気と角速度
02090  * 7            AMG(NO FUSION)加速度、地磁気、角速度
02091  * 8            IMU
02092  * 9            COMPASS
02093  * 10           M4G
02094  * 11           NDOF_FMC_OFF
02095  * 12           NDOF
02096  */
02097 char BOARDC_BNO055::getOperationMode(){
02098     return ctrl->rr(0, BNO055P0_OPR_MODE);
02099 }
02100 
02101 /* ==================================================================
02102  * システムの動作モードを設定する
02103  * ------------------------------------------------------------------
02104  * 引数modeValue:
02105  * 1            ACCONLY(NO FUSION)加速度のみ
02106  * 2            MAGONLY(NO FUSION)地磁気のみ
02107  * 3            GYROONLY(NO FUSION)角速度のみ
02108  * 4            ACCMAG(NO FUSION)加速度と地磁気
02109  * 5            ACCGYRO(NO FUSION)加速度と角速度
02110  * 6            MAGGYRO(NO FUSION)地磁気と角速度
02111  * 7            AMG(NO FUSION)加速度、地磁気、角速度
02112  * 8            IMU
02113  * 9            COMPASS
02114  * 10           M4G
02115  * 11           NDOF_FMC_OFF
02116  * 12           NDOF
02117  * ------------------------------------------------------------------
02118  * returns:
02119  * -1           失敗
02120  * 1            成功
02121  */
02122 char BOARDC_BNO055::setOperationMode(char modeValue){
02123     if(modeValue < 0 || modeValue > 12) modeValue = 7;
02124     return ctrl->wr(0, BNO055P0_OPR_MODE, modeValue);
02125 }
02126 
02127 /* ==================================================================
02128  * システムの動作モードを設定モードに設定する
02129  * ------------------------------------------------------------------
02130  * returns:
02131  * -1           失敗
02132  * 1            成功
02133  */
02134 char BOARDC_BNO055::setOperation_CONFIG(){
02135     return ctrl->wr(0, BNO055P0_OPR_MODE, 0);
02136 }
02137 
02138 /* ==================================================================
02139  * システムの動作モードを加速度モードに設定する
02140  * ------------------------------------------------------------------
02141  * returns:
02142  * -1           失敗
02143  * 1            成功
02144  */
02145 char BOARDC_BNO055::setOperation_ACCONRY(){
02146     return ctrl->wr(0, BNO055P0_OPR_MODE, 1);
02147 }
02148 
02149 /* ==================================================================
02150  * システムの動作モードを地磁気モードに設定する
02151  * ------------------------------------------------------------------
02152  * returns:
02153  * -1           失敗
02154  * 1            成功
02155  */
02156 char BOARDC_BNO055::setOperation_MAGONRY(){
02157     return ctrl->wr(0, BNO055P0_OPR_MODE, 2);
02158 }
02159 
02160 /* ==================================================================
02161  * システムの動作モードを角速度モードに設定する
02162  * ------------------------------------------------------------------
02163  * returns:
02164  * -1           失敗
02165  * 1            成功
02166  */
02167 char BOARDC_BNO055::setOperation_GYROONRY(){
02168     return ctrl->wr(0, BNO055P0_OPR_MODE, 3);
02169 }
02170 
02171 /* ==================================================================
02172  * システムの動作モードを加速度地磁気モードに設定する
02173  * ------------------------------------------------------------------
02174  * returns:
02175  * -1           失敗
02176  * 1            成功
02177  */
02178 char BOARDC_BNO055::setOperation_ACCMAG(){
02179     return ctrl->wr(0, BNO055P0_OPR_MODE, 4);
02180 }
02181 
02182 /* ==================================================================
02183  * システムの動作モードを加速度角速度モードに設定する
02184  * ------------------------------------------------------------------
02185  * returns:
02186  * -1           失敗
02187  * 1            成功
02188  */
02189 char BOARDC_BNO055::setOperation_ACCGYRO(){
02190     return ctrl->wr(0, BNO055P0_OPR_MODE, 5);
02191 }
02192 
02193 /* ==================================================================
02194  * システムの動作モードを地磁気角速度モードに設定する
02195  * ------------------------------------------------------------------
02196  * returns:
02197  * -1           失敗
02198  * 1            成功
02199  */
02200 char BOARDC_BNO055::setOperation_MAGGYRO(){
02201     return ctrl->wr(0, BNO055P0_OPR_MODE, 6);
02202 }
02203 
02204 /* ==================================================================
02205  * システムの動作モードをFusionなし9軸モードに設定する
02206  * ------------------------------------------------------------------
02207  * returns:
02208  * -1           失敗
02209  * 1            成功
02210  */
02211 char BOARDC_BNO055::setOperation_AMG(){
02212     return ctrl->wr(0, BNO055P0_OPR_MODE, 7);
02213 }
02214 
02215 /* ==================================================================
02216  * システムの動作モードを6軸(加速度、角速度)Fusionモードに設定する
02217  * ------------------------------------------------------------------
02218  * returns:
02219  * -1           失敗
02220  * 1            成功
02221  */
02222 char BOARDC_BNO055::setOperation_Fusion_IMU(){
02223     return ctrl->wr(0, BNO055P0_OPR_MODE, 8);
02224 }
02225 
02226 /* ==================================================================
02227  * システムの動作モードを6軸(加速度、地磁気)Fusionモード(相対系)に設定する
02228  * ------------------------------------------------------------------
02229  * returns:
02230  * -1           失敗
02231  * 1            成功
02232  */
02233 char BOARDC_BNO055::setOperation_Fusion_COMPASS(){
02234     return ctrl->wr(0, BNO055P0_OPR_MODE, 9);
02235 }
02236 
02237 /* ==================================================================
02238  * システムの動作モードを6軸(加速度、地磁気)Fusionモード(絶対系)に設定する
02239  * ------------------------------------------------------------------
02240  * returns:
02241  * -1           失敗
02242  * 1            成功
02243  */
02244 char BOARDC_BNO055::setOperation_Fusion_M4G(){
02245     return ctrl->wr(0, BNO055P0_OPR_MODE, 10);
02246 }
02247 
02248 /* ==================================================================
02249  * システムの動作モードをNDOFモード(地磁気短時間補正OFF)に設定する
02250  * ------------------------------------------------------------------
02251  * returns:
02252  * -1           失敗
02253  * 1            成功
02254  */
02255 char BOARDC_BNO055::setOperation_Fusion_NDOF_FMC_OFF(){
02256     return ctrl->wr(0, BNO055P0_OPR_MODE, 11);
02257 }
02258 
02259 /* ==================================================================
02260  * システムの動作モードをNDOFモードに設定する
02261  * ------------------------------------------------------------------
02262  * returns:
02263  * -1           失敗
02264  * 1            成功
02265  */
02266 char BOARDC_BNO055::setOperation_Fusion_NDOF(){
02267     return ctrl->wr(0, BNO055P0_OPR_MODE, 12);
02268 }
02269 
02270 /* ==================================================================
02271  * システムの電源モードを取得する
02272  * ------------------------------------------------------------------
02273  * returns:
02274  * 0: Normal
02275  * 1: LowPower
02276  * 2: Suspend
02277  */
02278 char BOARDC_BNO055::getPowerMode(){
02279     return ctrl->rr(0, BNO055P0_PWR_MODE);
02280 }
02281 
02282 /* ==================================================================
02283  * システムの電源モードを設定する
02284  * ------------------------------------------------------------------
02285  * modeValue:
02286  * 0: Normal
02287  * 1: LowPower
02288  * 2: Suspend
02289  * ------------------------------------------------------------------
02290  * returns:
02291  * -1           失敗
02292  * 1            成功
02293  */
02294 char BOARDC_BNO055::setPowerMode(unsigned char modeValue){
02295     if(modeValue > 2) return -1;
02296     return ctrl->wr(0, BNO055P0_PWR_MODE, modeValue);
02297 }
02298 
02299 /* ==================================================================
02300  * システムの電源モードを通常モードに設定する
02301  * ------------------------------------------------------------------
02302  * returns:
02303  * -1           失敗
02304  * 1            成功
02305  */
02306 char BOARDC_BNO055::setPowerMode_Normal(){
02307     return ctrl->wr(0, BNO055P0_PWR_MODE, 0);
02308 }
02309 
02310 /* ==================================================================
02311  * システムの電源モードを低消費電力モードに設定する
02312  * ------------------------------------------------------------------
02313  * returns:
02314  * -1           失敗
02315  * 1            成功
02316  */
02317 char BOARDC_BNO055::setPowerMode_LowPower(){
02318     return ctrl->wr(0, BNO055P0_PWR_MODE, 1);
02319 }
02320 
02321 /* ==================================================================
02322  * システムの電源モードをスリープモードに設定する
02323  * ------------------------------------------------------------------
02324  * returns:
02325  * -1           失敗
02326  * 1            成功
02327  */
02328 char BOARDC_BNO055::setPowerMode_Suspend(){
02329     return ctrl->wr(0, BNO055P0_PWR_MODE, 2);
02330 }
02331 
02332 /* ==================================================================
02333  * システムのトリガー設定を変更する
02334  * ------------------------------------------------------------------
02335  * returns:
02336  * -1           失敗
02337  * 0            変更なし
02338  * 1            成功
02339  */
02340 char BOARDC_BNO055::setSysTrigger(char regVal){
02341     clkExt = regVal >> 7;
02342     return ctrl->wr(0, BNO055P0_SYS_TRIGGER, regVal & 0xE1);
02343 }
02344 
02345 /* ==================================================================
02346  * システムのクロック発振元を設定する
02347  * 外部を指定する場合は、設定前にXIN,XOUTが発振子に結線されている必要がある
02348  * ------------------------------------------------------------------
02349  * returns:
02350  * -1           失敗
02351  * 0            変更なし
02352  * 1            成功
02353  */
02354 char BOARDC_BNO055::setSys_ExternalCrystal(bool isExternal){
02355     if(clkExt == isExternal) return 0;
02356 
02357     clkExt = isExternal;
02358     return ctrl->wr(0, BNO055P0_SYS_TRIGGER, (clkExt) ? 0x80 : 0x00);
02359 }
02360 
02361 /* ==================================================================
02362  * システムの割り込み発生をすべてリセットする
02363  * ------------------------------------------------------------------
02364  * returns:
02365  * -1           失敗
02366  * 1            成功
02367  */
02368 char BOARDC_BNO055::resetInterrupt(){
02369     return ctrl->wr(0, BNO055P0_SYS_TRIGGER, ((clkExt) ? 0x80 : 0x00) | 0x40);
02370 }
02371 
02372 /* ==================================================================
02373  * システムをリセットする
02374  * ------------------------------------------------------------------
02375  * returns:
02376  * -1           失敗
02377  * 1            成功
02378  */
02379 char BOARDC_BNO055::soft_reset(){
02380     return ctrl->wr(0, BNO055P0_SYS_TRIGGER, ((clkExt) ? 0x80 : 0x00) | 0x20);
02381 }
02382 
02383 /* ==================================================================
02384  * セルフテストを実行する
02385  * ------------------------------------------------------------------
02386  * returns:
02387  * -1           失敗
02388  * 1            成功
02389  */
02390 char BOARDC_BNO055::execSelfTest(){
02391     return ctrl->wr(0, BNO055P0_SYS_TRIGGER, ((clkExt) ? 0x80 : 0x00) | 0x01);
02392 }
02393 
02394 /* ==================================================================
02395  * システムの温度計測に使用するセンサーを取得する
02396  * ------------------------------------------------------------------
02397  * returns:
02398  * 0            温度計測に加速度センサーを使用している
02399  * 1            温度計測に角速度センサーを使用している
02400  */
02401 char BOARDC_BNO055::getTempSource(){
02402     return ctrl->rr(0, BNO055P0_TEMP_SOURCE);
02403 }
02404 
02405 /* ==================================================================
02406  * システムの温度計測に使用するセンサーを選択する
02407  * ------------------------------------------------------------------
02408  * 引数Accelerometer:
02409  * true:加速度センサーを温度計測に使用する
02410  * false:角速度センサーを温度計測に使用する
02411  * ------------------------------------------------------------------
02412  * returns:
02413  * -1           失敗
02414  * 1            成功
02415  */
02416 char BOARDC_BNO055::setTempSource(bool Accelerometer){
02417     return ctrl->wr(0, BNO055P0_TEMP_SOURCE, (Accelerometer) ? 0 : 1);
02418 }
02419 
02420 /* ==================================================================
02421  * センサー出力軸交換情報の取得
02422  * ------------------------------------------------------------------
02423  * returns:
02424  * AXIS_MAP_CONFIGの設定情報:BNO055データシート [3.4 Axis remap] を参照
02425  */
02426 char BOARDC_BNO055::getAxisMapConfig(){
02427     char ret = ctrl->rr(0, BNO055P0_AXIS_MAP_CONFIG);
02428     if(axisRemap != ret) axisRemap = ret;
02429     return axisRemap;
02430 }
02431 
02432 /* ==================================================================
02433  * センサー出力軸交換の設定
02434  * ------------------------------------------------------------------
02435  * 引数val:
02436  * X,Y,Zの出力交換の情報
02437  * (BNO055データシート [3.4 Axis remap] を参照
02438  * ------------------------------------------------------------------
02439  * returns:
02440  * -1           失敗
02441  * 0            変更なし
02442  * 1            成功
02443  */
02444 char BOARDC_BNO055::setAxisMapConfig(char val){
02445     if(axisRemap == (val & 0x3F)) return 0;
02446     else axisRemap = (val & 0x3F);
02447     return ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap);
02448 }
02449 
02450 /* ==================================================================
02451  * センサー出力軸符号情報の取得
02452  * ------------------------------------------------------------------
02453  * returns:
02454  * AXIS_MAP_SIGNの設定情報:BNO055データシート [3.4 Axis remap] を参照
02455  */
02456 char BOARDC_BNO055::getAxisMapSign(){
02457     char ret = ctrl->rr(0, BNO055P0_AXIS_MAP_SIGN);
02458     if(axisSign != ret) axisSign = ret;
02459     return axisSign;
02460 }
02461 
02462 /* ==================================================================
02463  * センサー出力軸符号の設定
02464  * ------------------------------------------------------------------
02465  * 引数val:
02466  * X,Y,Zの出力符号の情報
02467  * (BNO055データシート [3.4 Axis remap] を参照
02468  * ------------------------------------------------------------------
02469  * returns:
02470  * -1           失敗
02471  * 0            変更なし
02472  * 1            成功
02473  */
02474 char BOARDC_BNO055::setAxisMapSign(char val){
02475     if(axisSign == (val & 0x07)) return 0;
02476     else axisSign = (val & 0x07);
02477     return ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign);
02478 }
02479 
02480 /* ==================================================================
02481  * センサー出力軸の符号と交換を直感的に設定する[1pinが表側左上]
02482  * ------------------------------------------------------------------
02483  * (BNO055データシート [3.4 Axis remap] を参照
02484  * ------------------------------------------------------------------
02485  * returns:
02486  * -1           AXIS_MAP_CONFIG設定の失敗
02487  * -2           AXIS_MAP_SIGN設定の失敗
02488  * 1            成功
02489  */
02490 char BOARDC_BNO055::setAxisRemap_topview_topleft(){
02491     axisRemap = 0x21;
02492     axisSign = 0x04;
02493     char ret = 0;
02494     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap);
02495     if(ret == -1) return -1;
02496     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign);
02497     if(ret == -1) return -2;
02498     return 1;
02499 }
02500 
02501 /* ==================================================================
02502  * センサー出力軸の符号と交換を直感的に設定する[1pinが表側右上]
02503  * ------------------------------------------------------------------
02504  * (BNO055データシート [3.4 Axis remap] を参照
02505  * ------------------------------------------------------------------
02506  * returns:
02507  * -1           AXIS_MAP_CONFIG設定の失敗
02508  * -2           AXIS_MAP_SIGN設定の失敗
02509  * 1            成功
02510  */
02511 char BOARDC_BNO055::setAxisRemap_topview_topright(){
02512     axisRemap = 0x24;
02513     axisSign = 0x00;
02514     char ret = 0;
02515     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap);
02516     if(ret == -1) return -1;
02517     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign);
02518     if(ret == -1) return -2;
02519     return 1;
02520 }
02521 
02522 /* ==================================================================
02523  * センサー出力軸の符号と交換を直感的に設定する[1pinが表側左下]
02524  * ------------------------------------------------------------------
02525  * (BNO055データシート [3.4 Axis remap] を参照
02526  * ------------------------------------------------------------------
02527  * returns:
02528  * -1           AXIS_MAP_CONFIG設定の失敗
02529  * -2           AXIS_MAP_SIGN設定の失敗
02530  * 1            成功
02531  */
02532 char BOARDC_BNO055::setAxisRemap_topview_bottomleft(){
02533     axisRemap = 0x24;
02534     axisSign = 0x06;
02535     char ret = 0;
02536     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap);
02537     if(ret == -1) return -1;
02538     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign);
02539     if(ret == -1) return -2;
02540     return 1;
02541 }
02542 
02543 /* ==================================================================
02544  * センサー出力軸の符号と交換を直感的に設定する[1pinが表側右下]
02545  * ------------------------------------------------------------------
02546  * (BNO055データシート [3.4 Axis remap] を参照
02547  * ------------------------------------------------------------------
02548  * returns:
02549  * -1           AXIS_MAP_CONFIG設定の失敗
02550  * -2           AXIS_MAP_SIGN設定の失敗
02551  * 1            成功
02552  */
02553 char BOARDC_BNO055::setAxisRemap_topview_bottomright(){
02554     axisRemap = 0x21;
02555     axisSign = 0x02;
02556     char ret = 0;
02557     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap);
02558     if(ret == -1) return -1;
02559     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign);
02560     if(ret == -1) return -2;
02561     return 1;
02562 }
02563 
02564 /* ==================================================================
02565  * センサー出力軸の符号と交換を直感的に設定する[1pinが表側から見たとき裏側左上]
02566  * ------------------------------------------------------------------
02567  * (BNO055データシート [3.4 Axis remap] を参照
02568  * ------------------------------------------------------------------
02569  * returns:
02570  * -1           AXIS_MAP_CONFIG設定の失敗
02571  * -2           AXIS_MAP_SIGN設定の失敗
02572  * 1            成功
02573  */
02574 char BOARDC_BNO055::setAxisRemap_bottomview_topleft(){
02575     axisRemap = 0x24;
02576     axisSign = 0x03;
02577     char ret = 0;
02578     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap);
02579     if(ret == -1) return -1;
02580     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign);
02581     if(ret == -1) return -2;
02582     return 1;
02583 }
02584 
02585 /* ==================================================================
02586  * センサー出力軸の符号と交換を直感的に設定する[1pinが表側から見たとき裏側右上]
02587  * ------------------------------------------------------------------
02588  * (BNO055データシート [3.4 Axis remap] を参照
02589  * ------------------------------------------------------------------
02590  * returns:
02591  * -1           AXIS_MAP_CONFIG設定の失敗
02592  * -2           AXIS_MAP_SIGN設定の失敗
02593  * 1            成功
02594  */
02595 char BOARDC_BNO055::setAxisRemap_bottomview_topright(){
02596     axisRemap = 0x21;
02597     axisSign = 0x01;
02598     char ret = 0;
02599     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap);
02600     if(ret == -1) return -1;
02601     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign);
02602     if(ret == -1) return -2;
02603     return 1;
02604 }
02605 
02606 /* ==================================================================
02607  * センサー出力軸の符号と交換を直感的に設定する[1pinが表側から見たとき裏側左下]
02608  * ------------------------------------------------------------------
02609  * (BNO055データシート [3.4 Axis remap] を参照
02610  * ------------------------------------------------------------------
02611  * returns:
02612  * -1           AXIS_MAP_CONFIG設定の失敗
02613  * -2           AXIS_MAP_SIGN設定の失敗
02614  * 1            成功
02615  */
02616 char BOARDC_BNO055::setAxisRemap_bottomview_bottomleft(){
02617     axisRemap = 0x21;
02618     axisSign = 0x07;
02619     char ret = 0;
02620     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap);
02621     if(ret == -1) return -1;
02622     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign);
02623     if(ret == -1) return -2;
02624     return 1;
02625 }
02626 
02627 /* ==================================================================
02628  * センサー出力軸の符号と交換を直感的に設定する[1pinが表側から見たとき裏側右下]
02629  * ------------------------------------------------------------------
02630  * (BNO055データシート [3.4 Axis remap] を参照
02631  * ------------------------------------------------------------------
02632  * returns:
02633  * -1           AXIS_MAP_CONFIG設定の失敗
02634  * -2           AXIS_MAP_SIGN設定の失敗
02635  * 1            成功
02636  */
02637 char BOARDC_BNO055::setAxisRemap_bottomview_bottomright(){
02638     axisRemap = 0x24;
02639     axisSign = 0x05;
02640     char ret = 0;
02641     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_CONFIG, axisRemap);
02642     if(ret == -1) return -1;
02643     ret = ctrl->wr(0, BNO055P0_AXIS_MAP_SIGN, axisSign);
02644     if(ret == -1) return -2;
02645     return 1;
02646 }
02647 
02648 /* ==================================================================
02649  * センサー出力軸の符号と交換の情報を直感的な形で取得する
02650  * ------------------------------------------------------------------
02651  * (BNO055データシート [3.4 Axis remap] を参照
02652  * ------------------------------------------------------------------
02653  * returns:
02654  * 0            [P0]表側から見たとき、BNO055の1pinが表側左上にある状態
02655  * 1            [P1]表側から見たとき、BNO055の1pinが表側右上にある状態
02656  * 2            [P2]表側から見たとき、BNO055の1pinが表側左下にある状態
02657  * 3            [P3]表側から見たとき、BNO055の1pinが表側右下にある状態
02658  * 4            [P4]表側から見たとき、BNO055の1pinが裏側左上にある状態
02659  * 5            [P5]表側から見たとき、BNO055の1pinが裏側右上にある状態
02660  * 6            [P6]表側から見たとき、BNO055の1pinが裏側左下にある状態
02661  * 7            [P7]表側から見たとき、BNO055の1pinが裏側右下にある状態
02662  * -1           それ以外の設定
02663  */
02664 char BOARDC_BNO055::getAxisRemap_type(){
02665     getAxisMapConfig(); //axisRemapに最新の値を格納
02666     getAxisMapSign(); //axisSignに最新の値を格納
02667 
02668     if(axisRemap == 0x21){
02669         switch(axisSign){
02670             case 0x04:
02671                 return 0;
02672             case 0x02:
02673                 return 3;
02674             case 0x01:
02675                 return 5;
02676             case 0x07:
02677                 return 6;
02678         }
02679     }else if(axisRemap == 0x24){
02680         switch(axisSign){
02681             case 0x00:
02682                 return 1;
02683             case 0x06:
02684                 return 2;
02685             case 0x03:
02686                 return 4;
02687             case 0x05:
02688                 return 7;
02689         }
02690     }
02691 
02692     return -1;
02693 }
02694 
02695 /* ==================================================================
02696  * 加速度センサーの補正値を取得する
02697  * ------------------------------------------------------------------
02698  * &offsetX: アドレス参照引数:関数実行後、この変数にX軸補正値が格納される
02699  * &offsetY: アドレス参照引数:関数実行後、この変数にY軸補正値が格納される
02700  * &offsetZ: アドレス参照引数:関数実行後、この変数にZ軸補正値が格納される
02701  */
02702 void BOARDC_BNO055::getAccOffsetAll(float &offsetX, float &offsetY, float &offsetZ){
02703     //連続6byte読み取り
02704     char rsv[6];
02705     ctrl->rrc(0, BNO055P0_ACC_OFFSET_X_LSB, rsv, 6);
02706 
02707     short offX = (rsv[1] << 8) | rsv[0];
02708     short offY = (rsv[3] << 8) | rsv[2];
02709     short offZ = (rsv[5] << 8) | rsv[4];
02710     offsetX = (1.0f * offX) * scaleACC;
02711     offsetY = (1.0f * offY) * scaleACC;
02712     offsetZ = (1.0f * offZ) * scaleACC;
02713 }
02714 
02715 /* ==================================================================
02716  * 加速度センサーの補正値(X軸のみ)を取得する
02717  * ------------------------------------------------------------------
02718  * returns:
02719  * X軸補正値(スケール乗算済み)
02720  */
02721 float BOARDC_BNO055::getAccOffsetX(){
02722     //連続2byte読み取り
02723     char rsv[2];
02724     ctrl->rrc(0, BNO055P0_ACC_OFFSET_X_LSB, rsv, 2);
02725 
02726     short offX = (rsv[1] << 8) | rsv[0];
02727     return (1.0f * offX) * scaleACC;
02728 }
02729 
02730 /* ==================================================================
02731  * 加速度センサーの補正値(Y軸のみ)を取得する
02732  * ------------------------------------------------------------------
02733  * returns:
02734  * Y軸補正値(スケール乗算済み)
02735  */
02736 float BOARDC_BNO055::getAccOffsetY(){
02737     //連続2byte読み取り
02738     char rsv[2];
02739     ctrl->rrc(0, BNO055P0_ACC_OFFSET_Y_LSB, rsv, 2);
02740 
02741     short offX = (rsv[1] << 8) | rsv[0];
02742     return (1.0f * offX) * scaleACC;
02743 }
02744 
02745 /* ==================================================================
02746  * 加速度センサーの補正値(Z軸のみ)を取得する
02747  * ------------------------------------------------------------------
02748  * returns:
02749  * Z軸補正値(スケール乗算済み)
02750  */
02751 float BOARDC_BNO055::getAccOffsetZ(){
02752     //連続2byte読み取り
02753     char rsv[2];
02754     ctrl->rrc(0, BNO055P0_ACC_OFFSET_Z_LSB, rsv, 2);
02755 
02756     short offX = (rsv[1] << 8) | rsv[0];
02757     return (1.0f * offX) * scaleACC;
02758 }
02759 
02760 /* ==================================================================
02761  * 加速度センサーの補正値を設定する
02762  * ------------------------------------------------------------------
02763  * offsetX: スケール乗算済みのX軸の補正値
02764  * offsetY: スケール乗算済みのY軸の補正値
02765  * offsetZ: スケール乗算済みのZ軸の補正値
02766  * ------------------------------------------------------------------
02767  * returns:
02768  * -1           失敗
02769  * 1            成功
02770  */
02771 char BOARDC_BNO055::setAccOffsetAll(float offsetX, float offsetY, float offsetZ){
02772     short offX = (short)((offsetX / scaleACC) + 0.5f);
02773     short offY = (short)((offsetY / scaleACC) + 0.5f);
02774     short offZ = (short)((offsetZ / scaleACC) + 0.5f);
02775     char msg[6];
02776     msg[0] = offX & 0xFF;
02777     msg[1] = offX >> 8;
02778     msg[2] = offY & 0xFF;
02779     msg[3] = offY >> 8;
02780     msg[4] = offZ & 0xFF;
02781     msg[5] = offZ >> 8;
02782 
02783     //連続6byte書き込み
02784     return ctrl->wrc(0, BNO055P0_ACC_OFFSET_X_LSB, msg, 6);
02785 }
02786 
02787 char BOARDC_BNO055::setAccOffsetX(float offset){
02788     short offX = (short)((offset / scaleACC) + 0.5f);
02789     char msg[2];
02790     msg[0] = offX & 0xFF;
02791     msg[1] = offX >> 8;
02792 
02793     //連続2byte書き込み
02794     return ctrl->wrc(0, BNO055P0_ACC_OFFSET_X_LSB, msg, 2);
02795 }
02796 
02797 char BOARDC_BNO055::setAccOffsetY(float offset){
02798     short offY = (short)((offset / scaleACC) + 0.5f);
02799     char msg[2];
02800     msg[0] = offY & 0xFF;
02801     msg[1] = offY >> 8;
02802 
02803     //連続2byte書き込み
02804     return ctrl->wrc(0, BNO055P0_ACC_OFFSET_Y_LSB, msg, 2);
02805 }
02806 
02807 char BOARDC_BNO055::setAccOffsetZ(float offset){
02808     short offZ = (short)((offset / scaleACC) + 0.5f);
02809     char msg[2];
02810     msg[0] = offZ & 0xFF;
02811     msg[1] = offZ >> 8;
02812 
02813     //連続2byte書き込み
02814     return ctrl->wrc(0, BNO055P0_ACC_OFFSET_Z_LSB, msg, 2);
02815 }
02816 
02817 /* ==================================================================
02818  * 地磁気センサーの補正値を取得する
02819  * ------------------------------------------------------------------
02820  * &offsetX: アドレス参照引数:関数実行後、この変数にX軸補正値が格納される
02821  * &offsetY: アドレス参照引数:関数実行後、この変数にY軸補正値が格納される
02822  * &offsetZ: アドレス参照引数:関数実行後、この変数にZ軸補正値が格納される
02823  */
02824 void BOARDC_BNO055::getMagOffsetAll(float &offsetX, float &offsetY, float &offsetZ){
02825     //連続6byte読み取り
02826     char rsv[6];
02827     ctrl->rrc(0, BNO055P0_MAG_OFFSET_X_LSB, rsv, 6);
02828 
02829     short offX = (rsv[1] << 8) | rsv[0];
02830     short offY = (rsv[3] << 8) | rsv[2];
02831     short offZ = (rsv[5] << 8) | rsv[4];
02832     offsetX = (1.0f * offX) * scaleMAG;
02833     offsetY = (1.0f * offY) * scaleMAG;
02834     offsetZ = (1.0f * offZ) * scaleMAG;
02835 }
02836 
02837 /* ==================================================================
02838  * 地磁気センサーの補正値(X軸のみ)を取得する
02839  * ------------------------------------------------------------------
02840  * returns:
02841  * X軸補正値(スケール乗算済み)
02842  */
02843 float BOARDC_BNO055::getMagOffsetX(){
02844     //連続2byte読み取り
02845     char rsv[2];
02846     ctrl->rrc(0, BNO055P0_MAG_OFFSET_X_LSB, rsv, 2);
02847 
02848     short offX = (rsv[1] << 8) | rsv[0];
02849     return (1.0f * offX) * scaleMAG;
02850 }
02851 
02852 /* ==================================================================
02853  * 地磁気センサーの補正値(Y軸のみ)を取得する
02854  * ------------------------------------------------------------------
02855  * returns:
02856  * Y軸補正値(スケール乗算済み)
02857  */
02858 float BOARDC_BNO055::getMagOffsetY(){
02859     //連続2byte読み取り
02860     char rsv[2];
02861     ctrl->rrc(0, BNO055P0_MAG_OFFSET_Y_LSB, rsv, 2);
02862 
02863     short offY = (rsv[1] << 8) | rsv[0];
02864     return (1.0f * offY) * scaleMAG;
02865 }
02866 
02867 /* ==================================================================
02868  * 地磁気センサーの補正値(Z軸のみ)を取得する
02869  * ------------------------------------------------------------------
02870  * returns:
02871  * Z軸補正値(スケール乗算済み)
02872  */
02873 float BOARDC_BNO055::getMagOffsetZ(){
02874     //連続2byte読み取り
02875     char rsv[2];
02876     ctrl->rrc(0, BNO055P0_MAG_OFFSET_Z_LSB, rsv, 2);
02877 
02878     short offZ = (rsv[1] << 8) | rsv[0];
02879     return (1.0f * offZ) * scaleMAG;
02880 }
02881 
02882 /* ==================================================================
02883  * 地磁気センサーの補正値を設定する
02884  * ------------------------------------------------------------------
02885  * offsetX: スケール乗算済みのX軸の補正値
02886  * offsetY: スケール乗算済みのY軸の補正値
02887  * offsetZ: スケール乗算済みのZ軸の補正値
02888  * ------------------------------------------------------------------
02889  * returns:
02890  * -1           失敗
02891  * 1            成功
02892  */
02893 char BOARDC_BNO055::setMagOffsetAll(float offsetX, float offsetY, float offsetZ){
02894     short offX = (short)((offsetX / scaleMAG) + 0.5f);
02895     short offY = (short)((offsetY / scaleMAG) + 0.5f);
02896     short offZ = (short)((offsetZ / scaleMAG) + 0.5f);
02897     char msg[6];
02898     msg[0] = offX & 0xFF;
02899     msg[1] = offX >> 8;
02900     msg[2] = offY & 0xFF;
02901     msg[3] = offY >> 8;
02902     msg[4] = offZ & 0xFF;
02903     msg[5] = offZ >> 8;
02904 
02905     //連続6byte書き込み
02906     return ctrl->wrc(0, BNO055P0_MAG_OFFSET_X_LSB, msg, 6);
02907 }
02908 
02909 /* ==================================================================
02910  * 地磁気センサーの補正値(X軸のみ)を設定する
02911  * ------------------------------------------------------------------
02912  * offset: スケール乗算済みの補正値
02913  * ------------------------------------------------------------------
02914  * returns:
02915  * -1           失敗
02916  * 1            成功
02917  */
02918 char BOARDC_BNO055::setMagOffsetX(float offset){
02919     short offX = (short)((offset / scaleMAG) + 0.5f);
02920     char msg[2];
02921     msg[0] = offX & 0xFF;
02922     msg[1] = offX >> 8;
02923 
02924     //連続2byte書き込み
02925     return ctrl->wrc(0, BNO055P0_MAG_OFFSET_X_LSB, msg, 2);
02926 }
02927 
02928 /* ==================================================================
02929  * 地磁気センサーの補正値(Y軸のみ)を設定する
02930  * ------------------------------------------------------------------
02931  * offset: スケール乗算済みの補正値
02932  * ------------------------------------------------------------------
02933  * returns:
02934  * -1           失敗
02935  * 1            成功
02936  */
02937 char BOARDC_BNO055::setMagOffsetY(float offset){
02938     short offY = (short)((offset / scaleMAG) + 0.5f);
02939     char msg[2];
02940     msg[0] = offY & 0xFF;
02941     msg[1] = offY >> 8;
02942 
02943     //連続2byte書き込み
02944     return ctrl->wrc(0, BNO055P0_MAG_OFFSET_Y_LSB, msg, 2);
02945 }
02946 
02947 /* ==================================================================
02948  * 地磁気センサーの補正値(Z軸のみ)を設定する
02949  * ------------------------------------------------------------------
02950  * offset: スケール乗算済みの補正値
02951  * ------------------------------------------------------------------
02952  * returns:
02953  * -1           失敗
02954  * 1            成功
02955  */
02956 char BOARDC_BNO055::setMagOffsetZ(float offset){
02957     short offZ = (short)((offset / scaleMAG) + 0.5f);
02958     char msg[2];
02959     msg[0] = offZ & 0xFF;
02960     msg[1] = offZ >> 8;
02961 
02962     //連続2byte書き込み
02963     return ctrl->wrc(0, BNO055P0_MAG_OFFSET_Z_LSB, msg, 2);
02964 }
02965 
02966 /* ==================================================================
02967  * 角速度センサーの補正値を取得する
02968  * ------------------------------------------------------------------
02969  * &offsetX: アドレス参照引数:関数実行後、この変数にX軸補正値が格納される
02970  * &offsetY: アドレス参照引数:関数実行後、この変数にY軸補正値が格納される
02971  * &offsetZ: アドレス参照引数:関数実行後、この変数にZ軸補正値が格納される
02972  */
02973 void BOARDC_BNO055::getGyroOffsetAll(float &offsetX, float &offsetY, float &offsetZ){
02974     //連続6byte読み取り
02975     char rsv[6];
02976     ctrl->rrc(0, BNO055P0_GYR_OFFSET_X_LSB, rsv, 6);
02977 
02978     short offX = (rsv[1] << 8) | rsv[0];
02979     short offY = (rsv[3] << 8) | rsv[2];
02980     short offZ = (rsv[5] << 8) | rsv[4];
02981     offsetX = (1.0f * offX) * scaleGYRO;
02982     offsetY = (1.0f * offY) * scaleGYRO;
02983     offsetZ = (1.0f * offZ) * scaleGYRO;
02984 }
02985 
02986 /* ==================================================================
02987  * 角速度センサーの補正値(X軸のみ)を取得する
02988  * ------------------------------------------------------------------
02989  * returns:
02990  * X軸補正値(スケール乗算済み)
02991  */
02992 float BOARDC_BNO055::getGyroOffsetX(){
02993     //連続2byte読み取り
02994     char rsv[2];
02995     ctrl->rrc(0, BNO055P0_GYR_OFFSET_X_LSB, rsv, 2);
02996 
02997     short offX = (rsv[1] << 8) | rsv[0];
02998     return (1.0f * offX) * scaleGYRO;
02999 }
03000 
03001 /* ==================================================================
03002  * 角速度センサーの補正値(Y軸のみ)を取得する
03003  * ------------------------------------------------------------------
03004  * returns:
03005  * Y軸補正値(スケール乗算済み)
03006  */
03007 float BOARDC_BNO055::getGyroOffsetY(){
03008     //連続2byte読み取り
03009     char rsv[2];
03010     ctrl->rrc(0, BNO055P0_GYR_OFFSET_Y_LSB, rsv, 2);
03011 
03012     short offY = (rsv[1] << 8) | rsv[0];
03013     return (1.0f * offY) * scaleGYRO;
03014 }
03015 
03016 /* ==================================================================
03017  * 角速度センサーの補正値(Z軸のみ)を取得する
03018  * ------------------------------------------------------------------
03019  * returns:
03020  * Z軸補正値(スケール乗算済み)
03021  */
03022 float BOARDC_BNO055::getGyroOffsetZ(){
03023     //連続2byte読み取り
03024     char rsv[2];
03025     ctrl->rrc(0, BNO055P0_GYR_OFFSET_Z_LSB, rsv, 2);
03026 
03027     short offZ = (rsv[1] << 8) | rsv[0];
03028     return (1.0f * offZ) * scaleGYRO;
03029 }
03030 
03031 /* ==================================================================
03032  * 角速度センサーの補正値を設定する
03033  * ------------------------------------------------------------------
03034  * offsetX: スケール乗算済みのX軸の補正値
03035  * offsetY: スケール乗算済みのY軸の補正値
03036  * offsetZ: スケール乗算済みのZ軸の補正値
03037  * ------------------------------------------------------------------
03038  * returns:
03039  * -1           失敗
03040  * 1            成功
03041  */
03042 char BOARDC_BNO055::setGyroOffsetAll(float offsetX, float offsetY, float offsetZ){
03043     short offX = (short)((offsetX / scaleGYRO) + 0.5f);
03044     short offY = (short)((offsetY / scaleGYRO) + 0.5f);
03045     short offZ = (short)((offsetZ / scaleGYRO) + 0.5f);
03046     char msg[6];
03047     msg[0] = offX & 0xFF;
03048     msg[1] = offX >> 8;
03049     msg[2] = offY & 0xFF;
03050     msg[3] = offY >> 8;
03051     msg[4] = offZ & 0xFF;
03052     msg[5] = offZ >> 8;
03053 
03054     //連続6byte書き込み
03055     return ctrl->wrc(0, BNO055P0_GYR_OFFSET_X_LSB, msg, 6);
03056 }
03057 
03058 /* ==================================================================
03059  * 角速度センサーの補正値(X軸のみ)を設定する
03060  * ------------------------------------------------------------------
03061  * offset: スケール乗算済みの補正値
03062  * ------------------------------------------------------------------
03063  * returns:
03064  * -1           失敗
03065  * 1            成功
03066  */
03067 char BOARDC_BNO055::setGyroOffsetX(float offset){
03068     short offX = (short)((offset / scaleGYRO) + 0.5f);
03069     char msg[2];
03070     msg[0] = offX & 0xFF;
03071     msg[1] = offX >> 8;
03072 
03073     //連続2byte書き込み
03074     return ctrl->wrc(0, BNO055P0_GYR_OFFSET_X_LSB, msg, 2);
03075 }
03076 
03077 /* ==================================================================
03078  * 角速度センサーの補正値(Y軸のみ)を設定する
03079  * ------------------------------------------------------------------
03080  * offset: スケール乗算済みの補正値
03081  * ------------------------------------------------------------------
03082  * returns:
03083  * -1           失敗
03084  * 1            成功
03085  */
03086 char BOARDC_BNO055::setGyroOffsetY(float offset){
03087     short offY = (short)((offset / scaleGYRO) + 0.5f);
03088     char msg[2];
03089     msg[0] = offY & 0xFF;
03090     msg[1] = offY >> 8;
03091 
03092     //連続2byte書き込み
03093     return ctrl->wrc(0, BNO055P0_GYR_OFFSET_Y_LSB, msg, 2);
03094 }
03095 
03096 /* ==================================================================
03097  * 角速度センサーの補正値(Z軸のみ)を設定する
03098  * ------------------------------------------------------------------
03099  * offset: スケール乗算済みの補正値
03100  * ------------------------------------------------------------------
03101  * returns:
03102  * -1           失敗
03103  * 1            成功
03104  */
03105 char BOARDC_BNO055::setGyroOffsetZ(float offset){
03106     short offZ = (short)((offset / scaleGYRO) + 0.5f);
03107     char msg[2];
03108     msg[0] = offZ & 0xFF;
03109     msg[1] = offZ >> 8;
03110 
03111     //連続2byte書き込み
03112     return ctrl->wrc(0, BNO055P0_GYR_OFFSET_Z_LSB, msg, 2);
03113 }
03114 
03115 /* ==================================================================
03116  * 加速度センサーのデータ出力範囲[単位:LSB]を取得する
03117  * ------------------------------------------------------------------
03118  * returns:
03119  * +-データ計測範囲[単位:LSB]
03120  */
03121 short BOARDC_BNO055::getAccRadius(){
03122     //連続2byte読み取り
03123     char rsv[2];
03124     ctrl->rrc(0, BNO055P0_ACC_RADIUS_LSB, rsv, 2);
03125 
03126     return (rsv[1] << 8) | rsv[0];
03127 }
03128 
03129 /* ==================================================================
03130  * 加速度センサーのデータ出力範囲[単位:LSB]を設定する
03131  * ------------------------------------------------------------------
03132  * 引数r: データ計測範囲の最大値および最低値(-r から +r の範囲が計測範囲)
03133  * 最大値は1000[LSB]
03134  * ------------------------------------------------------------------
03135  * returns:
03136  * -1           失敗
03137  * 1            成功
03138  */
03139 char BOARDC_BNO055::setAccRadius(short LSB){
03140     if(LSB > 1000) LSB = 1000;
03141 
03142     char msg[2];
03143     msg[0] = LSB & 0xFF;
03144     msg[1] = LSB >> 8;
03145 
03146     //連続2byte書き込み
03147     return ctrl->wrc(0, BNO055P0_ACC_RADIUS_LSB, msg, 2);
03148 }
03149 
03150 /* ==================================================================
03151  * 地磁気センサーのデータ出力範囲[単位:LSB]を取得する
03152  * ------------------------------------------------------------------
03153  * returns:
03154  * +-データ計測範囲
03155  */
03156 short BOARDC_BNO055::getMagRadius(){
03157     //連続2byte読み取り
03158     char rsv[2];
03159     ctrl->rrc(0, BNO055P0_MAG_RADIUS_LSB, rsv, 2);
03160 
03161     return (rsv[1] << 8) | rsv[0];
03162 }
03163 
03164 /* ==================================================================
03165  * 加速度センサーのデータ出力範囲[単位:LSB]を設定する
03166  * ------------------------------------------------------------------
03167  * 引数r: データ計測範囲の最大値および最低値(-r から +r の範囲が計測範囲)
03168  * 最大値は960[LSB]
03169  * ------------------------------------------------------------------
03170  * returns:
03171  * -1           失敗
03172  * 1            成功
03173  */
03174 char BOARDC_BNO055::setMagRadius(short LSB){
03175     if(LSB > 960) LSB = 960;
03176 
03177     char msg[2];
03178     msg[0] = LSB & 0xFF;
03179     msg[1] = LSB >> 8;
03180 
03181     //連続2byte書き込み
03182     return ctrl->wrc(0, BNO055P0_MAG_RADIUS_LSB, msg, 2);
03183 }
03184 
03185 /* ==================================================================
03186  * 加速度センサー設定のレジスタ値を取得する
03187  * ------------------------------------------------------------------
03188  * returns:
03189  * 加速度センサー設定のレジスタ値
03190  */
03191 char BOARDC_BNO055::getAccConfig(){
03192     return ctrl->rr(1, BNO055P1_ACC_CONFIG);
03193 }
03194 
03195 /* ==================================================================
03196  * 加速度センサー設定のレジスタ値を設定する
03197  * ------------------------------------------------------------------
03198  * 引数regVal: 加速度センサー設定のレジスタ値
03199  * ------------------------------------------------------------------
03200  * returns:
03201  * -1           失敗
03202  * 1            成功
03203  */
03204 char BOARDC_BNO055::setAccConfig(char regVal){
03205     return ctrl->wr(1, BNO055P1_ACC_CONFIG, regVal);
03206 }
03207 
03208 /* ==================================================================
03209  * 加速度センサー設定のレジスタ値を設定する
03210  * ------------------------------------------------------------------
03211  * 引数gRange: 加速度センサーの計測範囲
03212  * 引数bandWidth: 加速度センサー出力レート(Fusion時は自動設定)
03213  * 引数powMode: 加速度センサー電源設定(Fusion時は自動設定)
03214  * ------------------------------------------------------------------
03215  * returns:
03216  * -1           失敗
03217  * 1            成功
03218  */
03219 char BOARDC_BNO055::setAccConfig(char gRange, char bandWidth, char powMode){
03220     char regVal = (powMode << 5) | (bandWidth << 2) | gRange;
03221     return ctrl->wr(1, BNO055P1_ACC_CONFIG, regVal);
03222 }
03223 
03224 /* ==================================================================
03225  * 加速度センサーの計測範囲を設定する
03226  * ------------------------------------------------------------------
03227  * 引数G: 加速度センサーの計測範囲(+-2, 4, 8, 16Gのいずれか)
03228  * ------------------------------------------------------------------
03229  * returns:
03230  * -1           失敗
03231  * 1            成功
03232  */
03233 char BOARDC_BNO055::setAccRange(unsigned char G){
03234     char val = 0;
03235     switch(G){
03236         case 2:
03237             val = 0x00;
03238             break;
03239         case 4:
03240             val = 0x01;
03241             break;
03242         case 8:
03243             val = 0x02;
03244             break;
03245         case 16:
03246             val = 0x03;
03247             break;
03248         default:
03249             val = 0x02;
03250     }
03251 
03252     char regVal = ctrl->rr(1, BNO055P1_ACC_CONFIG);
03253     regVal = (regVal & 0xFC) | val;
03254 
03255     return ctrl->wr(1, BNO055P1_ACC_CONFIG, regVal);
03256 }
03257 
03258 /* ==================================================================
03259  * 地磁気センサー設定のレジスタ値を取得する
03260  * ------------------------------------------------------------------
03261  * returns:
03262  * 地磁気センサー設定のレジスタ値
03263  */
03264 char BOARDC_BNO055::getMagConfig(){
03265     return ctrl->rr(1, BNO055P1_MAG_CONFIG);
03266 }
03267 
03268 /* ==================================================================
03269  * 地磁気センサー設定のレジスタ値を設定する
03270  * ------------------------------------------------------------------
03271  * 引数regVal: 地磁気センサー設定のレジスタ値
03272  * ------------------------------------------------------------------
03273  * returns:
03274  * -1           失敗
03275  * 1            成功
03276  */
03277 char BOARDC_BNO055::setMagConfig(char regVal){
03278     return ctrl->wr(1, BNO055P1_MAG_CONFIG, regVal);
03279 }
03280 
03281 /* ==================================================================
03282  * 地磁気センサー設定のレジスタ値を設定する
03283  * ------------------------------------------------------------------
03284  * 引数rate: 地磁気センサー出力レート(Fusion時は自動設定)
03285  * 引数oprMode: 地磁気センサー出力モード(Fusion時は自動設定)
03286  * 引数powMode: 地磁気センサー電源設定(Fusion時は自動設定)
03287  * ------------------------------------------------------------------
03288  * returns:
03289  * -1           失敗
03290  * 1            成功
03291  */
03292 char BOARDC_BNO055::setMagConfig(char rate, char oprMode, char powMode){
03293     char regVal = powMode << 5 | oprMode << 3 | rate;
03294     return ctrl->wr(1, BNO055P1_MAG_CONFIG, regVal);
03295 }
03296 
03297 /* ==================================================================
03298  * 角速度センサー設定(0)のレジスタ値を取得する
03299  * ------------------------------------------------------------------
03300  * returns:
03301  * 角速度センサー設定(0)のレジスタ値
03302  */
03303 char BOARDC_BNO055::getGyroConfig_0(){
03304     return ctrl->rr(1, BNO055P1_GYR_CONFIG_0);
03305 }
03306 
03307 /* ==================================================================
03308  * 角速度センサー設定(0)のレジスタ値を設定する
03309  * ------------------------------------------------------------------
03310  * 引数regVal: 角速度センサー設定(0)のレジスタ値
03311  * ------------------------------------------------------------------
03312  * returns:
03313  * -1           失敗
03314  * 1            成功
03315  */
03316 char BOARDC_BNO055::setGyroConfig_0(char regVal){
03317     return ctrl->wr(1, BNO055P1_GYR_CONFIG_0, regVal);
03318 }
03319 
03320 /* ==================================================================
03321  * 角速度センサー設定(0)のレジスタ値を設定する
03322  * ------------------------------------------------------------------
03323  * 引数range: 角速度センサーの計測範囲(Fusion時は自動設定)
03324  * 引数bandWidth: 角速度センサー出力レート(Fusion時は自動設定)
03325  * ------------------------------------------------------------------
03326  * returns:
03327  * -1           失敗
03328  * 1            成功
03329  */
03330 char BOARDC_BNO055::setGyroConfig_0(char range, char bandWidth){
03331     char regVal = bandWidth << 3 | range;
03332     return ctrl->wr(1, BNO055P1_GYR_CONFIG_0, regVal);
03333 }
03334 
03335 /* ==================================================================
03336  * 角速度センサー設定(1)のレジスタ値を取得する
03337  * ------------------------------------------------------------------
03338  * returns:
03339  * 角速度センサー設定(1)のレジスタ値
03340  */
03341 char BOARDC_BNO055::getGyroConfig_1(){
03342     return ctrl->rr(1, BNO055P1_GYR_CONFIG_0);
03343 }
03344 
03345 /* ==================================================================
03346  * 角速度センサー設定(1)のレジスタ値を設定する
03347  * ------------------------------------------------------------------
03348  * 引数powMode: 角速度センサーの電源設定(Fusion時は自動設定)
03349  * ------------------------------------------------------------------
03350  * returns:
03351  * -1           失敗
03352  * 1            成功
03353  */
03354 char BOARDC_BNO055::setGyroConfig_1(char powMode){
03355     return ctrl->wr(1, BNO055P1_GYR_CONFIG_0, powMode & 0x07);
03356 }
03357 
03358 /* ==================================================================
03359  * 角速度センサーの計測範囲を設定する
03360  * ------------------------------------------------------------------
03361  * 引数G: 角速度センサーの計測範囲(2000, 1000, 500, 250, 125dpsのいずれか)
03362  * ------------------------------------------------------------------
03363  * returns:
03364  * -1           失敗
03365  * 1            成功
03366  */
03367 char BOARDC_BNO055::setGyroRange(unsigned short dps){
03368     char val = 0;
03369     switch(dps){
03370         case 2000:
03371             val = 0;
03372             break;
03373         case 1000:
03374             val = 1;
03375             break;
03376         case 500:
03377             val = 2;
03378             break;
03379         case 250:
03380             val = 3;
03381             break;
03382         case 125:
03383             val = 4;
03384             break;
03385         default:
03386             val = 1;
03387     }
03388 
03389     char regVal = ctrl->rr(1, BNO055P1_GYR_CONFIG_0);
03390     regVal = (regVal & 0xF8) + val;
03391 
03392     return ctrl->wr(1, BNO055P1_GYR_CONFIG_0, regVal);
03393 }
03394 
03395 /* ==================================================================
03396  * 加速度センサーのスリープモードのレジスタ値を取得する
03397  * ------------------------------------------------------------------
03398  * returns:
03399  * 加速度センサーのスリープモードのレジスタ値
03400  */
03401 char BOARDC_BNO055::getAccSleepConfig(){
03402     return ctrl->rr(1, BNO055P1_ACC_SLEEP_CONFIG);
03403 }
03404 
03405 /* ==================================================================
03406  * 加速度センサーのスリープモードのレジスタ値を設定する
03407  * ------------------------------------------------------------------
03408  * 引数regVal: 加速度センサーのスリープモードのレジスタ値
03409  * ------------------------------------------------------------------
03410  * returns:
03411  * -1           失敗
03412  * 1            成功
03413  */
03414 char BOARDC_BNO055::setAccSleepConfig(char regVal){
03415     return ctrl->wr(1, BNO055P1_ACC_SLEEP_CONFIG, regVal);
03416 }
03417 
03418 /* ==================================================================
03419  * 加速度センサーのスリープモードのレジスタ値を設定する
03420  * ------------------------------------------------------------------
03421  * 引数duration: 加速度センサーのスリープモードの持続閾値
03422  * 引数mode: 加速度センサーのスリープモード選択
03423  * ------------------------------------------------------------------
03424  * returns:
03425  * -1           失敗
03426  * 1            成功
03427  */
03428 char BOARDC_BNO055::setAccSleepConfig(char duration, char mode){
03429     char regVal = duration << 1 | mode;
03430     return ctrl->wr(1, BNO055P1_ACC_SLEEP_CONFIG, regVal);
03431 }
03432 
03433 /* ==================================================================
03434  * 角速度センサーのスリープモードのレジスタ値を取得する
03435  * ------------------------------------------------------------------
03436  * returns:
03437  * 角速度センサーのスリープモードのレジスタ値
03438  */
03439 char BOARDC_BNO055::getGyroSleepConfig(){
03440     return ctrl->rr(1, BNO055P1_GYR_SLEEP_CONFIG);
03441 }
03442 
03443 /* ==================================================================
03444  * 角速度センサーのスリープモードのレジスタ値を設定する
03445  * ------------------------------------------------------------------
03446  * 引数regVal: 角速度センサーのスリープモードのレジスタ値
03447  * ------------------------------------------------------------------
03448  * returns:
03449  * -1           失敗
03450  * 1            成功
03451  */
03452 char BOARDC_BNO055::setGyroSleepConfig(char regVal){
03453     return ctrl->wr(1, BNO055P1_GYR_SLEEP_CONFIG, regVal);
03454 }
03455 
03456 /* ==================================================================
03457  * 角速度センサーのスリープモードのレジスタ値を設定する
03458  * ------------------------------------------------------------------
03459  * 引数duration: 角速度センサーの自動スリープモードの持続閾値
03460  * 引数mode: 角速度センサーのスリープモードの持続閾値
03461  * ------------------------------------------------------------------
03462  * returns:
03463  * -1           失敗
03464  * 1            成功
03465  */
03466 char BOARDC_BNO055::setGyroSleepConfig(char autoSleepDuration, char duration){
03467     char regVal = autoSleepDuration << 3 | duration;
03468     return ctrl->wr(1, BNO055P1_GYR_SLEEP_CONFIG, regVal);
03469 }
03470 
03471 /* ==================================================================
03472  * 各センサーの割り込みフラグ発生のINTピン出力許可設定を取得する
03473  * ------------------------------------------------------------------
03474  * returns:
03475  * 各センサーの割り込みフラグ有効無効設定のレジスタ値
03476  * 2bit目        角速度センサーAnyMotion割り込み(0:無効, 1:許可)
03477  * 3bit目        角速度センサーHighRate割り込み(0:無効, 1:許可)
03478  * 5bit目        加速度センサーHIGH_G割り込み(0:無効, 1:許可)
03479  * 6bit目        加速度センサーAnyMotion割り込み(0:無効, 1:許可)
03480  * 7bit目        加速度センサーNoMotion(SloMo)割り込み(0:無効, 1:許可)
03481  */
03482 char BOARDC_BNO055::getInterruptMask(){
03483     return ctrl->rr(1, BNO055P1_INT_MSK);
03484 }
03485 
03486 /* ==================================================================
03487  * 各センサーの割り込みフラグ発生のINTピン出力許可設定を設定する
03488  * ------------------------------------------------------------------
03489  * 引数mask: 各センサーの割り込みフラグ有効無効設定のレジスタ値
03490  * 2bit目        角速度センサーAnyMotion割り込み(0:無効, 1:許可)
03491  * 3bit目        角速度センサーHighRate割り込み(0:無効, 1:許可)
03492  * 5bit目        加速度センサーHIGH_G割り込み(0:無効, 1:許可)
03493  * 6bit目        加速度センサーAnyMotion割り込み(0:無効, 1:許可)
03494  * 7bit目        加速度センサーNoMotion(SloMo)割り込み(0:無効, 1:許可)
03495  * ------------------------------------------------------------------
03496  * returns:
03497  * -1           失敗
03498  * 1            成功
03499  */
03500 char BOARDC_BNO055::setInterruptMask(char mask){
03501     return ctrl->wr(1, BNO055P1_INT_MSK, mask);
03502 }
03503 
03504 /* ==================================================================
03505  * 各センサーの割り込みフラグ有効無効設定を取得する
03506  * ------------------------------------------------------------------
03507  * returns:
03508  * 各センサーの割り込みフラグ有効無効設定のレジスタ値
03509  * 2bit目        角速度センサーAnyMotion割り込み(0:無効, 1:有効)
03510  * 3bit目        角速度センサーHighRate割り込み(0:無効, 1:有効)
03511  * 5bit目        加速度センサーHIGH_G割り込み(0:無効, 1:有効)
03512  * 6bit目        加速度センサーAnyMotion割り込み(0:無効, 1:有効)
03513  * 7bit目        加速度センサーNoMotion(SloMo)割り込み(0:無効, 1:有効)
03514  */
03515 char BOARDC_BNO055::getInterruptEnable(){
03516     return ctrl->rr(1, BNO055P1_INT_EN);
03517 }
03518 
03519 /* ==================================================================
03520  * 各センサーの割り込みフラグ有効無効設定を設定する
03521  * ------------------------------------------------------------------
03522  * 引数mask: 各センサーの割り込みフラグ有効無効設定のレジスタ値
03523  * 2bit目        角速度センサーAnyMotion割り込み(0:無効, 1:有効)
03524  * 3bit目        角速度センサーHighRate割り込み(0:無効, 1:有効)
03525  * 5bit目        加速度センサーHIGH_G割り込み(0:無効, 1:有効)
03526  * 6bit目        加速度センサーAnyMotion割り込み(0:無効, 1:有効)
03527  * 7bit目        加速度センサーNoMotion(SloMo)割り込み(0:無効, 1:有効)
03528  * ------------------------------------------------------------------
03529  * returns:
03530  * -1           失敗
03531  * 1            成功
03532  */
03533 char BOARDC_BNO055::setInterruptEnable(char mask){
03534     return ctrl->wr(1, BNO055P1_INT_EN, mask);
03535 }
03536 
03537 /* ==================================================================
03538  * 加速度センサーのAnyMotion割り込み発生閾値を取得する
03539  * ------------------------------------------------------------------
03540  * 引数ismg: 出力する値の単位の選択(true: mG, false: mm/s^2)
03541  * ------------------------------------------------------------------
03542  * returns:
03543  * 加速度センサーのAnyMotion割り込み発生閾値
03544  */
03545 float BOARDC_BNO055::getAccAnyMotionThreashold(bool ismg){
03546     char rc = getAccConfig();
03547     float scale = 0.0f;
03548 
03549     switch(rc & 0x03){
03550         case 0:
03551             scale = 3.91;
03552             break;
03553         case 1:
03554             scale = 7.81;
03555             break;
03556         case 2:
03557             scale = 15.63;
03558             break;
03559         case 3:
03560             scale = 31.25;
03561             break;
03562     }
03563 
03564     scale *= (ismg) ? 1.0 : 9.80665;
03565 
03566     return (1.0 * ctrl->rr(1, BNO055P1_ACC_AM_THRES)) * scale;
03567 }
03568 
03569 /* ==================================================================
03570  * 加速度センサーのAnyMotion割り込み発生閾値を設定する
03571  * ------------------------------------------------------------------
03572  * 引数ismg: 設定する値の単位の選択(true: mG, false: mm/s^2)
03573  * 引数threashold: 単位変換済みの閾値
03574  * ------------------------------------------------------------------
03575  * returns:
03576  * -1           失敗
03577  * 1            成功
03578  */
03579 char BOARDC_BNO055::setAccAnyMotionThreashold(bool ismg, float threashold){
03580     char rc = getAccConfig();
03581     float scale = 0.0f;
03582 
03583     switch(rc & 0x03){
03584         case 0:
03585             scale = 3.91;
03586             break;
03587         case 1:
03588             scale = 7.81;
03589             break;
03590         case 2:
03591             scale = 15.63;
03592             break;
03593         case 3:
03594             scale = 31.25;
03595             break;
03596     }
03597 
03598     scale *= (ismg) ? 1.0 : 9.8;
03599 
03600     char cTh = (char)((threashold / scale) + 0.5);
03601 
03602     return ctrl->wr(1, BNO055P1_ACC_AM_THRES, cTh);
03603 }
03604 
03605 /* ==================================================================
03606  * 加速度センサーの割り込み使用設定を取得する
03607  * ------------------------------------------------------------------
03608  * returns:
03609  * 0bit目,1bit目  連続発生閾値([1bit目+0bit目+1]回の発生でフラグON)
03610  * 2bit目        AM/NM_X_AXISトリガー使用(0:使用しない, 1:使用する)
03611  * 3bit目        AM/NM_Y_AXISトリガー使用(0:使用しない, 1:使用する)
03612  * 4bit目        AM/NM_Z_AXISトリガー使用(0:使用しない, 1:使用する)
03613  * 5bit目        HG_X_AXISトリガー使用(0:使用しない, 1:使用する)
03614  * 6bit目        HG_Y_AXISトリガー使用(0:使用しない, 1:使用する)
03615  * 7bit目        HG_Z_AXISトリガー使用(0:使用しない, 1:使用する)
03616  */
03617 char BOARDC_BNO055::getAccInterruptSettings(){
03618     return ctrl->rr(1, BNO055P1_ACC_INT_SETTINGS);
03619 }
03620 
03621 /* ==================================================================
03622  * 加速度センサーの割り込み使用設定を設定する
03623  * ------------------------------------------------------------------
03624  * 引数settings:
03625  * 0bit目,1bit目  連続発生閾値([1bit目+0bit目+1]回の発生でフラグON)
03626  * 2bit目        AM/NM_X_AXISトリガー使用(0:使用しない, 1:使用する)
03627  * 3bit目        AM/NM_Y_AXISトリガー使用(0:使用しない, 1:使用する)
03628  * 4bit目        AM/NM_Z_AXISトリガー使用(0:使用しない, 1:使用する)
03629  * 5bit目        HG_X_AXISトリガー使用(0:使用しない, 1:使用する)
03630  * 6bit目        HG_Y_AXISトリガー使用(0:使用しない, 1:使用する)
03631  * 7bit目        HG_Z_AXISトリガー使用(0:使用しない, 1:使用する)
03632  * ------------------------------------------------------------------
03633  * returns:
03634  * -1           失敗
03635  * 1            成功
03636  */
03637 char BOARDC_BNO055::setAccInterruptSettings(char settings){
03638     return ctrl->wr(1, BNO055P1_ACC_INT_SETTINGS, settings);
03639 }
03640 
03641 /* ==================================================================
03642  * 加速度センサーのHighG割り込み閾値を取得する
03643  * ------------------------------------------------------------------
03644  * returns:
03645  * HighG割り込み発生閾値[単位:ミリ秒](2ms - 512ms)
03646  */
03647 unsigned short BOARDC_BNO055::getAccHighGduration(){
03648     return (ctrl->rr(1, BNO055P1_ACC_HG_DURATION) + 1) << 1;
03649 }
03650 
03651 /* ==================================================================
03652  * 加速度センサーのHighG割り込み継続発生閾値を設定する
03653  * ------------------------------------------------------------------
03654  * 引数ms: HighG割り込み継続発生閾値[単位:ミリ秒](2ms - 512ms)
03655  * ------------------------------------------------------------------
03656  * returns:
03657  * -1           失敗
03658  * 1            成功
03659  */
03660 char BOARDC_BNO055::setAccHighGduration(short ms){
03661     if(ms > 512 || ms < 2) return -1;
03662 
03663     ms = (ms >> 1) - 1;
03664 
03665     return ctrl->wr(1, BNO055P1_ACC_HG_DURATION, ms & 0xFF);
03666 }
03667 
03668 /* ==================================================================
03669  * 加速度センサーのHighG割り込み発生閾値を取得する
03670  * ------------------------------------------------------------------
03671  * 引数ismg: 出力する値の単位の選択(true: mG, false: mm/s^2)
03672  * ------------------------------------------------------------------
03673  * returns:
03674  * HighG割り込み発生閾値
03675  */
03676 float BOARDC_BNO055::getAccHighGThreashold(bool ismg){
03677     char rc = getAccConfig();
03678     float scale = 0.0f;
03679 
03680     switch(rc & 0x03){
03681         case 0:
03682             scale = 7.81;
03683             break;
03684         case 1:
03685             scale = 15.63;
03686             break;
03687         case 2:
03688             scale = 31.25;
03689             break;
03690         case 3:
03691             scale = 62.5;
03692             break;
03693     }
03694 
03695     scale *= (ismg) ? 1.0 : 9.8;
03696 
03697     return (1.0 * ctrl->rr(1, BNO055P1_ACC_HG_THRES)) * scale;
03698 }
03699 
03700 /* ==================================================================
03701  * 加速度センサーのHighG割り込み発生閾値を設定する
03702  * ------------------------------------------------------------------
03703  * 引数ismg: 設定する値の単位の選択(true: mG, false: mm/s^2)
03704  * 引数threashold: 単位変換済みの閾値
03705  * ------------------------------------------------------------------
03706  * returns:
03707  * -1           失敗
03708  * 1            成功
03709  */
03710 char BOARDC_BNO055::setAccHighGThreashold(bool ismg, float threashold){
03711     char rc = getAccConfig();
03712     float scale = 0.0f;
03713 
03714     switch(rc & 0x03){
03715         case 0:
03716             scale = 7.81;
03717             break;
03718         case 1:
03719             scale = 15.63;
03720             break;
03721         case 2:
03722             scale = 31.25;
03723             break;
03724         case 3:
03725             scale = 62.5;
03726             break;
03727     }
03728 
03729     scale *= (ismg) ? 1.0 : 9.8;
03730 
03731     char cTh = (char)((threashold / scale) + 0.5);
03732 
03733     return ctrl->wr(1, BNO055P1_ACC_HG_THRES, cTh);
03734 }
03735 
03736 /* ==================================================================
03737  * 加速度センサーのNoMotion割り込み発生閾値を取得する
03738  * ------------------------------------------------------------------
03739  * 引数ismg: 設定する値の単位の選択(true: mG, false: mm/s^2)
03740  * ------------------------------------------------------------------
03741  * returns:
03742  * NoMotion割り込み発生閾値
03743  */
03744 float BOARDC_BNO055::getAccNMThreashold(bool ismg){
03745     char rc = getAccConfig();
03746     float scale = 0.0f;
03747 
03748     switch(rc & 0x03){
03749         case 0:
03750             scale = 3.91;
03751             break;
03752         case 1:
03753             scale = 7.81;
03754             break;
03755         case 2:
03756             scale = 15.63;
03757             break;
03758         case 3:
03759             scale = 31.25;
03760             break;
03761     }
03762 
03763     scale *= (ismg) ? 1.0 : 9.8;
03764 
03765     return (1.0 * ctrl->rr(1, BNO055P1_ACC_NM_THRES)) * scale;
03766 }
03767 
03768 /* ==================================================================
03769  * 加速度センサーのNoMotion割り込み発生閾値を設定する
03770  * ------------------------------------------------------------------
03771  * 引数ismg: 設定する値の単位の選択(true: mG, false: mm/s^2)
03772  * 引数threashold: 単位変換済みの閾値
03773  * ------------------------------------------------------------------
03774  * returns:
03775  * -1           失敗
03776  * 1            成功
03777  */
03778 char BOARDC_BNO055::setAccNMThreashold(bool ismg, float threashold){
03779     char rc = getAccConfig();
03780     float scale = 0.0f;
03781 
03782     switch(rc & 0x03){
03783         case 0:
03784             scale = 3.91;
03785             break;
03786         case 1:
03787             scale = 7.81;
03788             break;
03789         case 2:
03790             scale = 15.63;
03791             break;
03792         case 3:
03793             scale = 31.25;
03794             break;
03795     }
03796 
03797     scale *= (ismg) ? 1.0 : 9.8;
03798 
03799     char cTh = (char)((threashold / scale) + 0.5);
03800 
03801     return ctrl->wr(1, BNO055P1_ACC_NM_THRES, cTh);
03802 }
03803 
03804 /* ==================================================================
03805  * 加速度センサーのNoMotion割り込み設定を取得する
03806  * ------------------------------------------------------------------
03807  * returns:
03808  * NoMotion割り込み設定値
03809  * 1bit目: スローモーション、ノーモーション選択(0:NoMotion, 1:SlowMotion)
03810  * 2 - 7bit目: slo_no_mot _dur設定値(データシート参照)
03811  */
03812 char BOARDC_BNO055::getAccNMsetting(){
03813     return ctrl->rr(1, BNO055P1_ACC_NM_SET);
03814 }
03815 
03816 /* ==================================================================
03817  * 加速度センサーのNoMotion割り込み設定を設定する
03818  * ------------------------------------------------------------------
03819  * 引数setting: NoMotion割り込み設定値
03820  * 1bit目: スローモーション、ノーモーション選択(0:NoMotion, 1:SlowMotion)
03821  * 2 - 7bit目: slo_no_mot _dur設定値(データシート参照)
03822  * ------------------------------------------------------------------
03823  * returns:
03824  * -1           失敗
03825  * 1            成功
03826  */
03827 char BOARDC_BNO055::setAccNMsetting(char setting){
03828     return ctrl->wr(1, BNO055P1_ACC_NM_SET, setting);
03829 }
03830 
03831 /* ==================================================================
03832  * 角速度センサーの割り込み設定を取得する
03833  * ------------------------------------------------------------------
03834  * returns:
03835  * 角速度センサーの割り込み設定レジスタ値
03836  */
03837 char BOARDC_BNO055::getGyroInterruptSettings(){
03838     return ctrl->rr(1, BNO055P1_GYR_INT_SETING);
03839 }
03840 
03841 /* ==================================================================
03842  * 角速度センサーの割り込み設定を設定する
03843  * ------------------------------------------------------------------
03844  * 引数setting: 角速度センサーの割り込み設定レジスタ値
03845  * ------------------------------------------------------------------
03846  * returns:
03847  * -1           失敗
03848  * 1            成功
03849  */
03850 char BOARDC_BNO055::setGyroInterruptSettings(char settings){
03851     return ctrl->wr(1, BNO055P1_GYR_INT_SETING, settings);
03852 }
03853 
03854 /* ==================================================================
03855  * 角速度センサーのHighRate割り込み設定(X軸のみ)を取得する
03856  * ------------------------------------------------------------------
03857  * 引数setting: 角速度センサーの割り込み設定レジスタ値
03858  */
03859 char BOARDC_BNO055::getGyroHighRateXsetting(){
03860     return ctrl->rr(1, BNO055P1_GYR_HR_X_SET);
03861 }
03862 
03863 /* ==================================================================
03864  * 角速度センサーのHighRate割り込み設定(X軸のみ、実際の値)を取得する
03865  * ------------------------------------------------------------------
03866  * 引数&hyst: アドレス参照引数:関数実行後、この変数にヒステリシスの値が格納される
03867  * 引数&thres: アドレス参照引数:関数実行後、この変数にスレッショルドの値が格納される
03868  */
03869 void BOARDC_BNO055::getGyroHighRateXsetting_dps(float &hyst, float &thres){
03870     char r = getGyroConfig_0();
03871     hyst = 0.0f;
03872     thres = 0.0f;
03873 
03874     switch(r & 0x07){
03875         case 0:
03876             hyst = 62.26;
03877             thres = 62.5;
03878             break;
03879         case 1:
03880             hyst = 31.13;
03881             thres = 31.25;
03882             break;
03883         case 2:
03884             hyst = 15.56;
03885             thres = 15.62;
03886             break;
03887         case 3:
03888             hyst = 7.78;
03889             thres = 7.81;
03890             break;
03891         case 4:
03892             hyst = 3.89;
03893             thres = 3.90;
03894             break;
03895     }
03896 
03897     char val = ctrl->rr(1, BNO055P1_GYR_HR_X_SET);
03898 
03899     hyst *= (float)((val & 0x60) * 1.0);
03900     thres *= (float)((val & 0x1F) * 1.0);
03901 }
03902 
03903 /* ==================================================================
03904  * 角速度センサーのHighRate割り込み設定(X軸のみ)を設定する
03905  * ------------------------------------------------------------------
03906  * 引数setting: 角速度センサーのHighRate割り込み設定レジスタ値
03907  * ------------------------------------------------------------------
03908  * returns:
03909  * -1           失敗
03910  * 1            成功
03911  */
03912 char BOARDC_BNO055::setGyroHighRateXsetting(char setting){
03913     return ctrl->wr(1, BNO055P1_GYR_HR_X_SET, setting);
03914 }
03915 
03916 /* ==================================================================
03917  * 角速度センサーのHighRate割り込み設定(X軸のみ)を設定する
03918  * ------------------------------------------------------------------
03919  * 引数hystVal: ヒステリシス
03920  * 引数thresVal: スレッショルド
03921  * ------------------------------------------------------------------
03922  * returns:
03923  * -1           失敗
03924  * 1            成功
03925  */
03926 char BOARDC_BNO055::setGyroHighRateXsetting_dps(float hystVal, float thresVal){
03927     char r = getGyroConfig_0();
03928     float hyst = 0.0f;
03929     float thres = 0.0f;
03930 
03931     switch(r & 0x07){
03932         case 0:
03933             hyst = 62.26;
03934             thres = 62.5;
03935             break;
03936         case 1:
03937             hyst = 31.13;
03938             thres = 31.25;
03939             break;
03940         case 2:
03941             hyst = 15.56;
03942             thres = 15.62;
03943             break;
03944         case 3:
03945             hyst = 7.78;
03946             thres = 7.81;
03947             break;
03948         case 4:
03949             hyst = 3.89;
03950             thres = 3.90;
03951             break;
03952     }
03953 
03954     char hystChar = (char)((hystVal / hyst) + 0.5);
03955     char thresChar = (char)((thresVal / thres) + 0.5);
03956 
03957     return ctrl->wr(1, BNO055P1_GYR_HR_X_SET, ((hystChar << 5) | thresChar));
03958 }
03959 
03960 /* ==================================================================
03961  * 角速度センサーのHighRate割り込み継続発生閾値(X軸のみ)を取得する
03962  * ------------------------------------------------------------------
03963  * returns:
03964  * HighRate割り込み継続発生閾値[単位:ミリ秒]
03965  */
03966 float BOARDC_BNO055::getGyroHighRateXduration(){
03967     return (float)(1 + ctrl->rr(1, BNO055P1_GYR_DUR_X)) * 2.5;
03968 }
03969 
03970 /* ==================================================================
03971  * 角速度センサーのHighRate割り込み継続発生閾値(X軸のみ)を設定する
03972  * ------------------------------------------------------------------
03973  * 引数duration: HighRate割り込み継続発生閾値[単位:ミリ秒]
03974  * ------------------------------------------------------------------
03975  * returns:
03976  * -1           失敗
03977  * 1            成功
03978  */
03979 char BOARDC_BNO055::setGyroHighRateXduration(float duration){
03980     return ctrl->wr(1, BNO055P1_GYR_HR_X_SET, (char)(((duration / 2.5) - 1.0) + 0.5));
03981 }
03982 
03983 /* ==================================================================
03984  * 角速度センサーのHighRate割り込み設定(Y軸のみ)を取得する
03985  * ------------------------------------------------------------------
03986  * returns:
03987  * 角速度センサーのHighRate割り込み設定
03988  */
03989 char BOARDC_BNO055::getGyroHighRateYsetting(){
03990     return ctrl->rr(1, BNO055P1_GYR_HR_Y_SET);
03991 }
03992 
03993 /* ==================================================================
03994  * 角速度センサーのHighRate割り込み設定(Y軸のみ、実際の値)を取得する
03995  * ------------------------------------------------------------------
03996  * 引数&hyst: アドレス参照引数:関数実行後、この変数にヒステリシスの値が格納される
03997  * 引数&thres: アドレス参照引数:関数実行後、この変数にスレッショルドの値が格納される
03998  */
03999 void BOARDC_BNO055::getGyroHighRateYsetting_dps(float &hyst, float &thres){
04000     char r = getGyroConfig_0();
04001     hyst = 0.0f;
04002     thres = 0.0f;
04003 
04004     switch(r & 0x07){
04005         case 0:
04006             hyst = 62.26;
04007             thres = 62.5;
04008             break;
04009         case 1:
04010             hyst = 31.13;
04011             thres = 31.25;
04012             break;
04013         case 2:
04014             hyst = 15.56;
04015             thres = 15.62;
04016             break;
04017         case 3:
04018             hyst = 7.78;
04019             thres = 7.81;
04020             break;
04021         case 4:
04022             hyst = 3.89;
04023             thres = 3.90;
04024             break;
04025     }
04026 
04027     char val = ctrl->rr(1, BNO055P1_GYR_HR_Y_SET);
04028 
04029     hyst *= (float)((val & 0x60) * 1.0);
04030     thres *= (float)((val & 0x1F) * 1.0);
04031 }
04032 
04033 /* ==================================================================
04034  * 角速度センサーのHighRate割り込み設定(Y軸のみ)を設定する
04035  * ------------------------------------------------------------------
04036  * 引数setting: 角速度センサーのHighRate割り込み設定レジスタ値
04037  * ------------------------------------------------------------------
04038  * returns:
04039  * -1           失敗
04040  * 1            成功
04041  */
04042 char BOARDC_BNO055::setGyroHighRateYsetting(char setting){
04043     return ctrl->wr(1, BNO055P1_GYR_HR_Y_SET, setting);
04044 }
04045 
04046 /* ==================================================================
04047  * 角速度センサーのHighRate割り込み設定(Y軸のみ)を設定する
04048  * ------------------------------------------------------------------
04049  * 引数hystVal: ヒステリシス
04050  * 引数thresVal: スレッショルド
04051  * ------------------------------------------------------------------
04052  * returns:
04053  * -1           失敗
04054  * 1            成功
04055  */
04056 char BOARDC_BNO055::setGyroHighRateYsetting_dps(float hystVal, float thresVal){
04057     char r = getGyroConfig_0();
04058     float hyst = 0.0f;
04059     float thres = 0.0f;
04060 
04061     switch(r & 0x07){
04062         case 0:
04063             hyst = 62.26;
04064             thres = 62.5;
04065             break;
04066         case 1:
04067             hyst = 31.13;
04068             thres = 31.25;
04069             break;
04070         case 2:
04071             hyst = 15.56;
04072             thres = 15.62;
04073             break;
04074         case 3:
04075             hyst = 7.78;
04076             thres = 7.81;
04077             break;
04078         case 4:
04079             hyst = 3.89;
04080             thres = 3.90;
04081             break;
04082     }
04083 
04084     char hystChar = (char)((hystVal / hyst) + 0.5);
04085     char thresChar = (char)((thresVal / thres) + 0.5);
04086 
04087     return ctrl->wr(1, BNO055P1_GYR_HR_Y_SET, ((hystChar << 5) | thresChar));
04088 }
04089 
04090 /* ==================================================================
04091  * 角速度センサーのHighRate割り込み継続発生閾値(Y軸のみ)を取得する
04092  * ------------------------------------------------------------------
04093  * returns:
04094  * HighRate割り込み継続発生閾値[単位:ミリ秒]
04095  */
04096 float BOARDC_BNO055::getGyroHighRateYduration(){
04097     return (float)(1 + ctrl->rr(1, BNO055P1_GYR_DUR_Y)) * 2.5;
04098 }
04099 
04100 /* ==================================================================
04101  * 角速度センサーのHighRate割り込み継続発生閾値(Y軸のみ)を設定する
04102  * ------------------------------------------------------------------
04103  * 引数duration: HighRate割り込み継続発生閾値[単位:ミリ秒]
04104  * ------------------------------------------------------------------
04105  * returns:
04106  * -1           失敗
04107  * 1            成功
04108  */
04109 char BOARDC_BNO055::setGyroHighRateYduration(float duration){
04110     return ctrl->wr(1, BNO055P1_GYR_HR_Y_SET, (char)(((duration / 2.5) - 1.0) + 0.5));
04111 }
04112 
04113 /* ==================================================================
04114  * 角速度センサーのHighRate割り込み設定(Z軸のみ)を取得する
04115  * ------------------------------------------------------------------
04116  * returns:
04117  * 角速度センサーのHighRate割り込み設定レジスタ値
04118  */
04119 char BOARDC_BNO055::getGyroHighRateZsetting(){
04120     return ctrl->rr(1, BNO055P1_GYR_HR_Z_SET);
04121 }
04122 
04123 /* ==================================================================
04124  * 角速度センサーのHighRate割り込み設定(Z軸のみ、実際の値)を取得する
04125  * ------------------------------------------------------------------
04126  * 引数&hyst: アドレス参照引数:関数実行後、この変数にヒステリシスの値が格納される
04127  * 引数&thres: アドレス参照引数:関数実行後、この変数にスレッショルドの値が格納される
04128  */
04129 void BOARDC_BNO055::getGyroHighRateZsetting_dps(float &hyst, float &thres){
04130     char r = getGyroConfig_0();
04131     hyst = 0.0f;
04132     thres = 0.0f;
04133 
04134     switch(r & 0x07){
04135         case 0:
04136             hyst = 62.26;
04137             thres = 62.5;
04138             break;
04139         case 1:
04140             hyst = 31.13;
04141             thres = 31.25;
04142             break;
04143         case 2:
04144             hyst = 15.56;
04145             thres = 15.62;
04146             break;
04147         case 3:
04148             hyst = 7.78;
04149             thres = 7.81;
04150             break;
04151         case 4:
04152             hyst = 3.89;
04153             thres = 3.90;
04154             break;
04155     }
04156 
04157     char val = ctrl->rr(1, BNO055P1_GYR_HR_Z_SET);
04158 
04159     hyst *= (float)((val & 0x60) * 1.0);
04160     thres *= (float)((val & 0x1F) * 1.0);
04161 }
04162 
04163 /* ==================================================================
04164  * 角速度センサーのHighRate割り込み設定(Z軸のみ)を設定する
04165  * ------------------------------------------------------------------
04166  * 引数setting: 角速度センサーのHighRate割り込み設定レジスタ値
04167  * ------------------------------------------------------------------
04168  * returns:
04169  * -1           失敗
04170  * 1            成功
04171  */
04172 char BOARDC_BNO055::setGyroHighRateZsetting(char setting){
04173     return ctrl->wr(1, BNO055P1_GYR_HR_Z_SET, setting);
04174 }
04175 
04176 /* ==================================================================
04177  * 角速度センサーのHighRate割り込み設定(Z軸のみ)を設定する
04178  * ------------------------------------------------------------------
04179  * 引数hystVal: ヒステリシス
04180  * 引数thresVal: スレッショルド
04181  * ------------------------------------------------------------------
04182  * returns:
04183  * -1           失敗
04184  * 1            成功
04185  */
04186 char BOARDC_BNO055::setGyroHighRateZsetting_dps(float hystVal, float thresVal){
04187     char r = getGyroConfig_0();
04188     float hyst = 0.0f;
04189     float thres = 0.0f;
04190 
04191     switch(r & 0x07){
04192         case 0:
04193             hyst = 62.26;
04194             thres = 62.5;
04195             break;
04196         case 1:
04197             hyst = 31.13;
04198             thres = 31.25;
04199             break;
04200         case 2:
04201             hyst = 15.56;
04202             thres = 15.62;
04203             break;
04204         case 3:
04205             hyst = 7.78;
04206             thres = 7.81;
04207             break;
04208         case 4:
04209             hyst = 3.89;
04210             thres = 3.90;
04211             break;
04212     }
04213 
04214     char hystChar = (char)((hystVal / hyst) + 0.5);
04215     char thresChar = (char)((thresVal / thres) + 0.5);
04216 
04217     return ctrl->wr(1, BNO055P1_GYR_HR_Z_SET, ((hystChar << 5) | thresChar));
04218 }
04219 
04220 /* ==================================================================
04221  * 角速度センサーのHighRate割り込み継続発生閾値(Z軸のみ)を取得する
04222  * ------------------------------------------------------------------
04223  * returns:
04224  * HighRate割り込み継続発生閾値[単位:ミリ秒]
04225  */
04226 float BOARDC_BNO055::getGyroHighRateZduration(){
04227     return (float)(1 + ctrl->rr(1, BNO055P1_GYR_DUR_Z)) * 2.5;
04228 }
04229 
04230 /* ==================================================================
04231  * 角速度センサーのHighRate割り込み継続発生閾値(Z軸のみ)を設定する
04232  * ------------------------------------------------------------------
04233  * 引数duration: HighRate割り込み継続発生閾値[単位:ミリ秒]
04234  * ------------------------------------------------------------------
04235  * returns:
04236  * -1           失敗
04237  * 1            成功
04238  */
04239 char BOARDC_BNO055::setGyroHighRateZduration(float duration){
04240     return ctrl->wr(1, BNO055P1_GYR_HR_Z_SET, (char)(((duration / 2.5) - 1.0) + 0.5));
04241 }
04242 
04243 /* ==================================================================
04244  * 角速度センサーのAnyMotion割り込み閾値を取得する
04245  * ------------------------------------------------------------------
04246  * returns:
04247  * AnyMotion割り込み閾値[単位:dps]
04248  */
04249 float BOARDC_BNO055::getGyroAnyMotionThreashold(){
04250     char r = getGyroConfig_0();
04251     float scale = 0.0f;
04252 
04253     switch(r & 0x07){
04254         case 0:
04255             scale = 1.0f;
04256             break;
04257         case 1:
04258             scale = 0.5;
04259             break;
04260         case 2:
04261             scale = 0.25;
04262             break;
04263         case 3:
04264             scale = 0.125;
04265             break;
04266         case 4:
04267             scale = 0.0625;
04268             break;
04269     }
04270 
04271     return (1.0f * ctrl->rr(1, BNO055P1_GYR_AM_THRES)) * scale;
04272 }
04273 
04274 /* ==================================================================
04275  * 角速度センサーのAnyMotion割り込み閾値を設定する
04276  * ------------------------------------------------------------------
04277  * 引数threashold: AnyMotion割り込み閾値[単位:dps]
04278  * ------------------------------------------------------------------
04279  * returns:
04280  * -1           失敗
04281  * 1            成功
04282  */
04283 char BOARDC_BNO055::setGyroAnyMotionThreashold(float threashold){
04284     char r = getGyroConfig_0();
04285     float scale = 0.0f;
04286 
04287     switch(r & 0x07){
04288         case 0:
04289             scale = 1.0f;
04290             break;
04291         case 1:
04292             scale = 0.5;
04293             break;
04294         case 2:
04295             scale = 0.25;
04296             break;
04297         case 3:
04298             scale = 0.125;
04299             break;
04300         case 4:
04301             scale = 0.0625;
04302             break;
04303     }
04304 
04305     return ctrl->wr(1, BNO055P1_GYR_AM_THRES, (char)((threashold / scale) + 0.5));
04306 }
04307 
04308 /* ==================================================================
04309  * 加速度センサーのAnyMotion割り込み閾値を取得する
04310  * ------------------------------------------------------------------
04311  * returns:
04312  * AnyMotion割り込み設定レジスタ値
04313  */
04314 char BOARDC_BNO055::getAccAnyMotionSetting(){
04315     return ctrl->rr(1, BNO055P1_GYR_AM_SET);
04316 }
04317 
04318 /* ==================================================================
04319  * 加速度センサーのAnyMotion割り込み閾値を設定する
04320  * ------------------------------------------------------------------
04321  * 引数setting: AnyMotion割り込み設定レジスタ値
04322  * ------------------------------------------------------------------
04323  * returns:
04324  * -1           失敗
04325  * 1            成功
04326  */
04327 char BOARDC_BNO055::setAccAnyMotionSetting(char setting){
04328     return ctrl->wr(1, BNO055P1_GYR_AM_SET, setting);
04329 }