![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
imu for l432kc
MPU6050.h@4:7b04752df27f, 2018-12-08 (annotated)
- Committer:
- sunninety1
- Date:
- Sat Dec 08 05:48:54 2018 +0000
- Revision:
- 4:7b04752df27f
- Parent:
- 2:01ca44dd3908
for l432kc;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sunninety1 | 2:01ca44dd3908 | 1 | /*Use #define MPU6050_ES before you include this file if you have an engineering sample (older EVBs will have them), to find out if you have one, check your accelerometer output. |
sunninety1 | 2:01ca44dd3908 | 2 | If it is half of what you expected, and you still are on the correct planet, you got an engineering sample |
sunninety1 | 2:01ca44dd3908 | 3 | */ |
sunninety1 | 2:01ca44dd3908 | 4 | |
sunninety1 | 2:01ca44dd3908 | 5 | |
sunninety1 | 2:01ca44dd3908 | 6 | #ifndef MPU6050_H |
sunninety1 | 2:01ca44dd3908 | 7 | #define MPU6050_H |
sunninety1 | 2:01ca44dd3908 | 8 | |
sunninety1 | 2:01ca44dd3908 | 9 | /** |
sunninety1 | 2:01ca44dd3908 | 10 | * Includes |
sunninety1 | 2:01ca44dd3908 | 11 | */ |
sunninety1 | 2:01ca44dd3908 | 12 | #include "mbed.h" |
sunninety1 | 2:01ca44dd3908 | 13 | |
sunninety1 | 2:01ca44dd3908 | 14 | |
sunninety1 | 2:01ca44dd3908 | 15 | /** |
sunninety1 | 2:01ca44dd3908 | 16 | * Defines */ |
sunninety1 | 2:01ca44dd3908 | 17 | //modif prog by salvat |
sunninety1 | 2:01ca44dd3908 | 18 | #ifndef _MPU6050_ADDRESS |
sunninety1 | 2:01ca44dd3908 | 19 | #define _MPU6050_ADDRESS |
sunninety1 | 2:01ca44dd3908 | 20 | |
sunninety1 | 2:01ca44dd3908 | 21 | |
sunninety1 | 2:01ca44dd3908 | 22 | #endif |
sunninety1 | 2:01ca44dd3908 | 23 | |
sunninety1 | 2:01ca44dd3908 | 24 | #ifdef MPU6050_ES |
sunninety1 | 2:01ca44dd3908 | 25 | #define DOUBLE_ACCELERO |
sunninety1 | 2:01ca44dd3908 | 26 | #endif |
sunninety1 | 2:01ca44dd3908 | 27 | |
sunninety1 | 2:01ca44dd3908 | 28 | /** |
sunninety1 | 2:01ca44dd3908 | 29 | * Registers |
sunninety1 | 2:01ca44dd3908 | 30 | */ |
sunninety1 | 2:01ca44dd3908 | 31 | #define MPU6050_CONFIG_REG 0x1A |
sunninety1 | 2:01ca44dd3908 | 32 | #define MPU6050_GYRO_CONFIG_REG 0x1B |
sunninety1 | 2:01ca44dd3908 | 33 | #define MPU6050_ACCELERO_CONFIG_REG 0x1C |
sunninety1 | 2:01ca44dd3908 | 34 | |
sunninety1 | 2:01ca44dd3908 | 35 | #define MPU6050_INT_PIN_CFG 0x37 |
sunninety1 | 2:01ca44dd3908 | 36 | |
sunninety1 | 2:01ca44dd3908 | 37 | #define MPU6050_ACCEL_XOUT_H_REG 0x3B |
sunninety1 | 2:01ca44dd3908 | 38 | #define MPU6050_ACCEL_YOUT_H_REG 0x3D |
sunninety1 | 2:01ca44dd3908 | 39 | #define MPU6050_ACCEL_ZOUT_H_REG 0x3F |
sunninety1 | 2:01ca44dd3908 | 40 | |
sunninety1 | 2:01ca44dd3908 | 41 | #define MPU6050_TEMP_H_REG 0x41 |
sunninety1 | 2:01ca44dd3908 | 42 | |
sunninety1 | 2:01ca44dd3908 | 43 | #define MPU6050_GYRO_XOUT_H_REG 0x43 |
sunninety1 | 2:01ca44dd3908 | 44 | #define MPU6050_GYRO_YOUT_H_REG 0x45 |
sunninety1 | 2:01ca44dd3908 | 45 | #define MPU6050_GYRO_ZOUT_H_REG 0x47 |
sunninety1 | 2:01ca44dd3908 | 46 | |
sunninety1 | 2:01ca44dd3908 | 47 | |
sunninety1 | 2:01ca44dd3908 | 48 | |
sunninety1 | 2:01ca44dd3908 | 49 | #define MPU6050_PWR_MGMT_1_REG 0x6B |
sunninety1 | 2:01ca44dd3908 | 50 | #define MPU6050_WHO_AM_I_REG 0x75 |
sunninety1 | 2:01ca44dd3908 | 51 | |
sunninety1 | 2:01ca44dd3908 | 52 | |
sunninety1 | 2:01ca44dd3908 | 53 | |
sunninety1 | 2:01ca44dd3908 | 54 | /** |
sunninety1 | 2:01ca44dd3908 | 55 | * Definitions |
sunninety1 | 2:01ca44dd3908 | 56 | */ |
sunninety1 | 2:01ca44dd3908 | 57 | #define MPU6050_SLP_BIT 6 |
sunninety1 | 2:01ca44dd3908 | 58 | #define MPU6050_BYPASS_BIT 1 |
sunninety1 | 2:01ca44dd3908 | 59 | |
sunninety1 | 2:01ca44dd3908 | 60 | #define MPU6050_BW_256 0 |
sunninety1 | 2:01ca44dd3908 | 61 | #define MPU6050_BW_188 1 |
sunninety1 | 2:01ca44dd3908 | 62 | #define MPU6050_BW_98 2 |
sunninety1 | 2:01ca44dd3908 | 63 | #define MPU6050_BW_42 3 |
sunninety1 | 2:01ca44dd3908 | 64 | #define MPU6050_BW_20 4 |
sunninety1 | 2:01ca44dd3908 | 65 | #define MPU6050_BW_10 5 |
sunninety1 | 2:01ca44dd3908 | 66 | #define MPU6050_BW_5 6 |
sunninety1 | 2:01ca44dd3908 | 67 | |
sunninety1 | 2:01ca44dd3908 | 68 | #define MPU6050_ACCELERO_RANGE_2G 0 |
sunninety1 | 2:01ca44dd3908 | 69 | #define MPU6050_ACCELERO_RANGE_4G 1 |
sunninety1 | 2:01ca44dd3908 | 70 | #define MPU6050_ACCELERO_RANGE_8G 2 |
sunninety1 | 2:01ca44dd3908 | 71 | #define MPU6050_ACCELERO_RANGE_16G 3 |
sunninety1 | 2:01ca44dd3908 | 72 | |
sunninety1 | 2:01ca44dd3908 | 73 | #define MPU6050_GYRO_RANGE_250 0 |
sunninety1 | 2:01ca44dd3908 | 74 | #define MPU6050_GYRO_RANGE_500 1 |
sunninety1 | 2:01ca44dd3908 | 75 | #define MPU6050_GYRO_RANGE_1000 2 |
sunninety1 | 2:01ca44dd3908 | 76 | #define MPU6050_GYRO_RANGE_2000 3 |
sunninety1 | 2:01ca44dd3908 | 77 | |
sunninety1 | 2:01ca44dd3908 | 78 | |
sunninety1 | 2:01ca44dd3908 | 79 | /** MPU6050 IMU library. |
sunninety1 | 2:01ca44dd3908 | 80 | * |
sunninety1 | 2:01ca44dd3908 | 81 | * Example: |
sunninety1 | 2:01ca44dd3908 | 82 | * @code |
sunninety1 | 2:01ca44dd3908 | 83 | * Later, maybe |
sunninety1 | 2:01ca44dd3908 | 84 | * @endcode |
sunninety1 | 2:01ca44dd3908 | 85 | */ |
sunninety1 | 2:01ca44dd3908 | 86 | class MPU6050 { |
sunninety1 | 2:01ca44dd3908 | 87 | public: |
sunninety1 | 2:01ca44dd3908 | 88 | /** |
sunninety1 | 2:01ca44dd3908 | 89 | * Constructor. |
sunninety1 | 2:01ca44dd3908 | 90 | * |
sunninety1 | 2:01ca44dd3908 | 91 | * Sleep mode of MPU6050 is immediatly disabled |
sunninety1 | 2:01ca44dd3908 | 92 | * |
sunninety1 | 2:01ca44dd3908 | 93 | * @param sda - mbed pin to use for the SDA I2C line. |
sunninety1 | 2:01ca44dd3908 | 94 | * @param scl - mbed pin to use for the SCL I2C line. |
sunninety1 | 2:01ca44dd3908 | 95 | */ |
sunninety1 | 2:01ca44dd3908 | 96 | MPU6050(PinName sda, PinName scl); |
sunninety1 | 2:01ca44dd3908 | 97 | |
sunninety1 | 2:01ca44dd3908 | 98 | |
sunninety1 | 2:01ca44dd3908 | 99 | /** |
sunninety1 | 2:01ca44dd3908 | 100 | * Tests the I2C connection by reading the WHO_AM_I register. |
sunninety1 | 2:01ca44dd3908 | 101 | * |
sunninety1 | 2:01ca44dd3908 | 102 | * @return True for a working connection, false for an error |
sunninety1 | 2:01ca44dd3908 | 103 | */ |
sunninety1 | 2:01ca44dd3908 | 104 | bool testConnection( void ); |
sunninety1 | 2:01ca44dd3908 | 105 | |
sunninety1 | 2:01ca44dd3908 | 106 | /** |
sunninety1 | 2:01ca44dd3908 | 107 | * Sets the bandwidth of the digital low-pass filter |
sunninety1 | 2:01ca44dd3908 | 108 | * |
sunninety1 | 2:01ca44dd3908 | 109 | * Macros: MPU6050_BW_256 - MPU6050_BW_188 - MPU6050_BW_98 - MPU6050_BW_42 - MPU6050_BW_20 - MPU6050_BW_10 - MPU6050_BW_5 |
sunninety1 | 2:01ca44dd3908 | 110 | * Last number is the gyro's BW in Hz (accelero BW is virtually identical) |
sunninety1 | 2:01ca44dd3908 | 111 | * |
sunninety1 | 2:01ca44dd3908 | 112 | * @param BW - The three bits that set the bandwidth (use the predefined macros) |
sunninety1 | 2:01ca44dd3908 | 113 | */ |
sunninety1 | 2:01ca44dd3908 | 114 | void setBW( char BW ); |
sunninety1 | 2:01ca44dd3908 | 115 | |
sunninety1 | 2:01ca44dd3908 | 116 | /** |
sunninety1 | 2:01ca44dd3908 | 117 | * Sets the auxiliary I2C bus in bypass mode to read the sensors behind the MPU6050 (useful for eval board, otherwise just connect them to primary I2C bus) |
sunninety1 | 2:01ca44dd3908 | 118 | * |
sunninety1 | 2:01ca44dd3908 | 119 | * @param state - Enables/disables the I2C bypass mode |
sunninety1 | 2:01ca44dd3908 | 120 | */ |
sunninety1 | 2:01ca44dd3908 | 121 | void setI2CBypass ( bool state ); |
sunninety1 | 2:01ca44dd3908 | 122 | |
sunninety1 | 2:01ca44dd3908 | 123 | /** |
sunninety1 | 2:01ca44dd3908 | 124 | * Sets the Accelero full-scale range |
sunninety1 | 2:01ca44dd3908 | 125 | * |
sunninety1 | 2:01ca44dd3908 | 126 | * Macros: MPU6050_ACCELERO_RANGE_2G - MPU6050_ACCELERO_RANGE_4G - MPU6050_ACCELERO_RANGE_8G - MPU6050_ACCELERO_RANGE_16G |
sunninety1 | 2:01ca44dd3908 | 127 | * |
sunninety1 | 2:01ca44dd3908 | 128 | * @param range - The two bits that set the full-scale range (use the predefined macros) |
sunninety1 | 2:01ca44dd3908 | 129 | */ |
sunninety1 | 2:01ca44dd3908 | 130 | void setAcceleroRange(char range); |
sunninety1 | 2:01ca44dd3908 | 131 | |
sunninety1 | 2:01ca44dd3908 | 132 | /** |
sunninety1 | 2:01ca44dd3908 | 133 | * Reads the accelero x-axis. |
sunninety1 | 2:01ca44dd3908 | 134 | * |
sunninety1 | 2:01ca44dd3908 | 135 | * @return 16-bit signed integer x-axis accelero data |
sunninety1 | 2:01ca44dd3908 | 136 | */ |
sunninety1 | 2:01ca44dd3908 | 137 | int getAcceleroRawX( void ); |
sunninety1 | 2:01ca44dd3908 | 138 | |
sunninety1 | 2:01ca44dd3908 | 139 | /** |
sunninety1 | 2:01ca44dd3908 | 140 | * Reads the accelero y-axis. |
sunninety1 | 2:01ca44dd3908 | 141 | * |
sunninety1 | 2:01ca44dd3908 | 142 | * @return 16-bit signed integer y-axis accelero data |
sunninety1 | 2:01ca44dd3908 | 143 | */ |
sunninety1 | 2:01ca44dd3908 | 144 | int getAcceleroRawY( void ); |
sunninety1 | 2:01ca44dd3908 | 145 | |
sunninety1 | 2:01ca44dd3908 | 146 | /** |
sunninety1 | 2:01ca44dd3908 | 147 | * Reads the accelero z-axis. |
sunninety1 | 2:01ca44dd3908 | 148 | * |
sunninety1 | 2:01ca44dd3908 | 149 | * @return 16-bit signed integer z-axis accelero data |
sunninety1 | 2:01ca44dd3908 | 150 | */ |
sunninety1 | 2:01ca44dd3908 | 151 | int getAcceleroRawZ( void ); |
sunninety1 | 2:01ca44dd3908 | 152 | |
sunninety1 | 2:01ca44dd3908 | 153 | /** |
sunninety1 | 2:01ca44dd3908 | 154 | * Reads all accelero data. |
sunninety1 | 2:01ca44dd3908 | 155 | * |
sunninety1 | 2:01ca44dd3908 | 156 | * @param data - pointer to signed integer array with length three: data[0] = X, data[1] = Y, data[2] = Z |
sunninety1 | 2:01ca44dd3908 | 157 | */ |
sunninety1 | 2:01ca44dd3908 | 158 | void getAcceleroRaw( int *data ); |
sunninety1 | 2:01ca44dd3908 | 159 | |
sunninety1 | 2:01ca44dd3908 | 160 | /** |
sunninety1 | 2:01ca44dd3908 | 161 | * Reads all accelero data, gives the acceleration in m/s2 |
sunninety1 | 2:01ca44dd3908 | 162 | * |
sunninety1 | 2:01ca44dd3908 | 163 | * Function uses the last setup value of the full scale range, if you manually set in another range, this won't work. |
sunninety1 | 2:01ca44dd3908 | 164 | * |
sunninety1 | 2:01ca44dd3908 | 165 | * @param data - pointer to float array with length three: data[0] = X, data[1] = Y, data[2] = Z |
sunninety1 | 2:01ca44dd3908 | 166 | */ |
sunninety1 | 2:01ca44dd3908 | 167 | void getAccelero( float *data ); |
sunninety1 | 2:01ca44dd3908 | 168 | |
sunninety1 | 2:01ca44dd3908 | 169 | /** |
sunninety1 | 2:01ca44dd3908 | 170 | * Sets the Gyro full-scale range |
sunninety1 | 2:01ca44dd3908 | 171 | * |
sunninety1 | 2:01ca44dd3908 | 172 | * Macros: MPU6050_GYRO_RANGE_250 - MPU6050_GYRO_RANGE_500 - MPU6050_GYRO_RANGE_1000 - MPU6050_GYRO_RANGE_2000 |
sunninety1 | 2:01ca44dd3908 | 173 | * |
sunninety1 | 2:01ca44dd3908 | 174 | * @param range - The two bits that set the full-scale range (use the predefined macros) |
sunninety1 | 2:01ca44dd3908 | 175 | */ |
sunninety1 | 2:01ca44dd3908 | 176 | void setGyroRange(char range); |
sunninety1 | 2:01ca44dd3908 | 177 | |
sunninety1 | 2:01ca44dd3908 | 178 | /** |
sunninety1 | 2:01ca44dd3908 | 179 | * Reads the gyro x-axis. |
sunninety1 | 2:01ca44dd3908 | 180 | * |
sunninety1 | 2:01ca44dd3908 | 181 | * @return 16-bit signed integer x-axis gyro data |
sunninety1 | 2:01ca44dd3908 | 182 | */ |
sunninety1 | 2:01ca44dd3908 | 183 | int getGyroRawX( void ); |
sunninety1 | 2:01ca44dd3908 | 184 | |
sunninety1 | 2:01ca44dd3908 | 185 | /** |
sunninety1 | 2:01ca44dd3908 | 186 | * Reads the gyro y-axis. |
sunninety1 | 2:01ca44dd3908 | 187 | * |
sunninety1 | 2:01ca44dd3908 | 188 | * @return 16-bit signed integer y-axis gyro data |
sunninety1 | 2:01ca44dd3908 | 189 | */ |
sunninety1 | 2:01ca44dd3908 | 190 | int getGyroRawY( void ); |
sunninety1 | 2:01ca44dd3908 | 191 | |
sunninety1 | 2:01ca44dd3908 | 192 | /** |
sunninety1 | 2:01ca44dd3908 | 193 | * Reads the gyro z-axis. |
sunninety1 | 2:01ca44dd3908 | 194 | * |
sunninety1 | 2:01ca44dd3908 | 195 | * @return 16-bit signed integer z-axis gyro data |
sunninety1 | 2:01ca44dd3908 | 196 | */ |
sunninety1 | 2:01ca44dd3908 | 197 | int getGyroRawZ( void ); |
sunninety1 | 2:01ca44dd3908 | 198 | |
sunninety1 | 2:01ca44dd3908 | 199 | /** |
sunninety1 | 2:01ca44dd3908 | 200 | * Reads all gyro data. |
sunninety1 | 2:01ca44dd3908 | 201 | * |
sunninety1 | 2:01ca44dd3908 | 202 | * @param data - pointer to signed integer array with length three: data[0] = X, data[1] = Y, data[2] = Z |
sunninety1 | 2:01ca44dd3908 | 203 | */ |
sunninety1 | 2:01ca44dd3908 | 204 | void getGyroRaw( int *data ); |
sunninety1 | 2:01ca44dd3908 | 205 | |
sunninety1 | 2:01ca44dd3908 | 206 | /** |
sunninety1 | 2:01ca44dd3908 | 207 | * Reads all gyro data, gives the gyro in rad/s |
sunninety1 | 2:01ca44dd3908 | 208 | * |
sunninety1 | 2:01ca44dd3908 | 209 | * Function uses the last setup value of the full scale range, if you manually set in another range, this won't work. |
sunninety1 | 2:01ca44dd3908 | 210 | * |
sunninety1 | 2:01ca44dd3908 | 211 | * @param data - pointer to float array with length three: data[0] = X, data[1] = Y, data[2] = Z |
sunninety1 | 2:01ca44dd3908 | 212 | */ |
sunninety1 | 2:01ca44dd3908 | 213 | void getGyro( float *data); |
sunninety1 | 2:01ca44dd3908 | 214 | |
sunninety1 | 2:01ca44dd3908 | 215 | /** |
sunninety1 | 2:01ca44dd3908 | 216 | * Reads temperature data. |
sunninety1 | 2:01ca44dd3908 | 217 | * |
sunninety1 | 2:01ca44dd3908 | 218 | * @return 16 bit signed integer with the raw temperature register value |
sunninety1 | 2:01ca44dd3908 | 219 | */ |
sunninety1 | 2:01ca44dd3908 | 220 | int getTempRaw( void ); |
sunninety1 | 2:01ca44dd3908 | 221 | |
sunninety1 | 2:01ca44dd3908 | 222 | /** |
sunninety1 | 2:01ca44dd3908 | 223 | * Returns current temperature |
sunninety1 | 2:01ca44dd3908 | 224 | * |
sunninety1 | 2:01ca44dd3908 | 225 | * @returns float with the current temperature |
sunninety1 | 2:01ca44dd3908 | 226 | */ |
sunninety1 | 2:01ca44dd3908 | 227 | float getTemp( void ); |
sunninety1 | 2:01ca44dd3908 | 228 | |
sunninety1 | 2:01ca44dd3908 | 229 | /** |
sunninety1 | 2:01ca44dd3908 | 230 | * Sets the sleep mode of the MPU6050 |
sunninety1 | 2:01ca44dd3908 | 231 | * |
sunninety1 | 2:01ca44dd3908 | 232 | * @param state - true for sleeping, false for wake up |
sunninety1 | 2:01ca44dd3908 | 233 | */ |
sunninety1 | 2:01ca44dd3908 | 234 | void setSleepMode( bool state ); |
sunninety1 | 2:01ca44dd3908 | 235 | |
sunninety1 | 2:01ca44dd3908 | 236 | |
sunninety1 | 2:01ca44dd3908 | 237 | /** |
sunninety1 | 2:01ca44dd3908 | 238 | * Writes data to the device, could be private, but public is handy so you can transmit directly to the MPU. |
sunninety1 | 2:01ca44dd3908 | 239 | * |
sunninety1 | 2:01ca44dd3908 | 240 | * @param adress - register address to write to |
sunninety1 | 2:01ca44dd3908 | 241 | * @param data - data to write |
sunninety1 | 2:01ca44dd3908 | 242 | */ |
sunninety1 | 2:01ca44dd3908 | 243 | void write( char address, char data); |
sunninety1 | 2:01ca44dd3908 | 244 | |
sunninety1 | 2:01ca44dd3908 | 245 | /** |
sunninety1 | 2:01ca44dd3908 | 246 | * Read data from the device, could be private, but public is handy so you can transmit directly to the MPU. |
sunninety1 | 2:01ca44dd3908 | 247 | * |
sunninety1 | 2:01ca44dd3908 | 248 | * @param adress - register address to write to |
sunninety1 | 2:01ca44dd3908 | 249 | * @return - data from the register specified by RA |
sunninety1 | 2:01ca44dd3908 | 250 | */ |
sunninety1 | 2:01ca44dd3908 | 251 | char read( char adress); |
sunninety1 | 2:01ca44dd3908 | 252 | |
sunninety1 | 2:01ca44dd3908 | 253 | /** |
sunninety1 | 2:01ca44dd3908 | 254 | * Read multtiple regigsters from the device, more efficient than using multiple normal reads. |
sunninety1 | 2:01ca44dd3908 | 255 | * |
sunninety1 | 2:01ca44dd3908 | 256 | * @param adress - register address to write to |
sunninety1 | 2:01ca44dd3908 | 257 | * @param length - number of bytes to read |
sunninety1 | 2:01ca44dd3908 | 258 | * @param data - pointer where the data needs to be written to |
sunninety1 | 2:01ca44dd3908 | 259 | */ |
sunninety1 | 2:01ca44dd3908 | 260 | void read( char adress, char *data, int length); |
sunninety1 | 2:01ca44dd3908 | 261 | |
sunninety1 | 2:01ca44dd3908 | 262 | /** |
sunninety1 | 2:01ca44dd3908 | 263 | * Find all I2C devices and print all devices I2C + update MPU6050_ADDRESS (choice between 0x68 and 0X69) |
sunninety1 | 2:01ca44dd3908 | 264 | * |
sunninety1 | 2:01ca44dd3908 | 265 | */ |
sunninety1 | 2:01ca44dd3908 | 266 | bool I2C_finder(); |
sunninety1 | 2:01ca44dd3908 | 267 | |
sunninety1 | 2:01ca44dd3908 | 268 | private: |
sunninety1 | 2:01ca44dd3908 | 269 | I2C connection; |
sunninety1 | 2:01ca44dd3908 | 270 | char currentAcceleroRange; |
sunninety1 | 2:01ca44dd3908 | 271 | char currentGyroRange; |
sunninety1 | 2:01ca44dd3908 | 272 | // add by salvat : permet de trouver l'adresse du MPU6050 dans testConnexion |
sunninety1 | 2:01ca44dd3908 | 273 | char MPU6050_ADDRESS;// address pin low (GND), default for InvenSense evaluation board |
sunninety1 | 2:01ca44dd3908 | 274 | bool isFindMPU6050; |
sunninety1 | 2:01ca44dd3908 | 275 | |
sunninety1 | 2:01ca44dd3908 | 276 | |
sunninety1 | 2:01ca44dd3908 | 277 | |
sunninety1 | 2:01ca44dd3908 | 278 | }; |
sunninety1 | 2:01ca44dd3908 | 279 | |
sunninety1 | 2:01ca44dd3908 | 280 | |
sunninety1 | 2:01ca44dd3908 | 281 | |
sunninety1 | 2:01ca44dd3908 | 282 | #endif |