Naresh Krish
/
itracker-mbed-os-example-lis3dh
Sample program on how to use the LIS3DH sensor on the RAKWireless iTracker module
LIS3DH/LIS3DH.h@0:cd96b05ace6e, 2018-02-12 (annotated)
- Committer:
- knaresh89
- Date:
- Mon Feb 12 05:05:29 2018 +0000
- Revision:
- 0:cd96b05ace6e
Sample program on how to use the LIS3DH sensor on the RAKWireless iTracker module
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
knaresh89 | 0:cd96b05ace6e | 1 | /* |
knaresh89 | 0:cd96b05ace6e | 2 | * mbed library program |
knaresh89 | 0:cd96b05ace6e | 3 | * LIS3DH MEMS motion sensor: 3-axis "nano" accelerometer, made by STMicroelectronics |
knaresh89 | 0:cd96b05ace6e | 4 | * http://www.st-japan.co.jp/web/jp/catalog/sense_power/FM89/SC444/PF250725 |
knaresh89 | 0:cd96b05ace6e | 5 | * |
knaresh89 | 0:cd96b05ace6e | 6 | * Copyright (c) 2014,'15,'17 Kenji Arai / JH1PJL |
knaresh89 | 0:cd96b05ace6e | 7 | * http://www.page.sannet.ne.jp/kenjia/index.html |
knaresh89 | 0:cd96b05ace6e | 8 | * http://mbed.org/users/kenjiArai/ |
knaresh89 | 0:cd96b05ace6e | 9 | * Created: July 14th, 2014 |
knaresh89 | 0:cd96b05ace6e | 10 | * Revised: August 23rd, 2017 |
knaresh89 | 0:cd96b05ace6e | 11 | */ |
knaresh89 | 0:cd96b05ace6e | 12 | |
knaresh89 | 0:cd96b05ace6e | 13 | #ifndef LIS3DH_H |
knaresh89 | 0:cd96b05ace6e | 14 | #define LIS3DH_H |
knaresh89 | 0:cd96b05ace6e | 15 | |
knaresh89 | 0:cd96b05ace6e | 16 | #include "mbed.h" |
knaresh89 | 0:cd96b05ace6e | 17 | |
knaresh89 | 0:cd96b05ace6e | 18 | // revision 6 have two bugs, (1) read_mg_data, (2) divided by 15 (16 is coorect value) |
knaresh89 | 0:cd96b05ace6e | 19 | #define OLD_REV 0 // KEEP 0!! (If you set 1, work as old revision) |
knaresh89 | 0:cd96b05ace6e | 20 | |
knaresh89 | 0:cd96b05ace6e | 21 | // LIS3DH Address |
knaresh89 | 0:cd96b05ace6e | 22 | // 7bit address = 0b001100x(0x18 or 0x19 depends on SA0/SDO) |
knaresh89 | 0:cd96b05ace6e | 23 | #define LIS3DH_G_CHIP_ADDR (0x18 << 1) // SA0(=SDO pin) = Ground |
knaresh89 | 0:cd96b05ace6e | 24 | #define LIS3DH_V_CHIP_ADDR (0x19 << 1) // SA0(=SDO pin) = Vdd This is the one for itracker module |
knaresh89 | 0:cd96b05ace6e | 25 | |
knaresh89 | 0:cd96b05ace6e | 26 | |
knaresh89 | 0:cd96b05ace6e | 27 | // LIS3DH ID |
knaresh89 | 0:cd96b05ace6e | 28 | #define I_AM_LIS3DH 0x33 |
knaresh89 | 0:cd96b05ace6e | 29 | |
knaresh89 | 0:cd96b05ace6e | 30 | // Register's definition |
knaresh89 | 0:cd96b05ace6e | 31 | #define LIS3DH_STATUS_REG_AUX 0x07 |
knaresh89 | 0:cd96b05ace6e | 32 | #define LIS3DH_OUT_ADC1_L 0x08 |
knaresh89 | 0:cd96b05ace6e | 33 | #define LIS3DH_OUT_ADC1_H 0x09 |
knaresh89 | 0:cd96b05ace6e | 34 | #define LIS3DH_OUT_ADC2_L 0x0a |
knaresh89 | 0:cd96b05ace6e | 35 | #define LIS3DH_OUT_ADC2_H 0x0b |
knaresh89 | 0:cd96b05ace6e | 36 | #define LIS3DH_OUT_ADC3_L 0x0c |
knaresh89 | 0:cd96b05ace6e | 37 | #define LIS3DH_OUT_ADC3_H 0x0d |
knaresh89 | 0:cd96b05ace6e | 38 | #define LIS3DH_INT_COUNTER_REG 0x0e |
knaresh89 | 0:cd96b05ace6e | 39 | #define LIS3DH_WHO_AM_I 0x0f |
knaresh89 | 0:cd96b05ace6e | 40 | #define LIS3DH_TEMP_CFG_REG 0x1f |
knaresh89 | 0:cd96b05ace6e | 41 | #define LIS3DH_CTRL_REG1 0x20 |
knaresh89 | 0:cd96b05ace6e | 42 | #define LIS3DH_CTRL_REG2 0x21 |
knaresh89 | 0:cd96b05ace6e | 43 | #define LIS3DH_CTRL_REG3 0x22 |
knaresh89 | 0:cd96b05ace6e | 44 | #define LIS3DH_CTRL_REG4 0x23 |
knaresh89 | 0:cd96b05ace6e | 45 | #define LIS3DH_CTRL_REG5 0x24 |
knaresh89 | 0:cd96b05ace6e | 46 | #define LIS3DH_CTRL_REG6 0x25 |
knaresh89 | 0:cd96b05ace6e | 47 | #define LIS3DH_REFERENCE 0x26 |
knaresh89 | 0:cd96b05ace6e | 48 | #define LIS3DH_STATUS_REG 0x27 |
knaresh89 | 0:cd96b05ace6e | 49 | #define LIS3DH_OUT_X_L 0x28 |
knaresh89 | 0:cd96b05ace6e | 50 | #define LIS3DH_OUT_X_H 0x29 |
knaresh89 | 0:cd96b05ace6e | 51 | #define LIS3DH_OUT_Y_L 0x2a |
knaresh89 | 0:cd96b05ace6e | 52 | #define LIS3DH_OUT_Y_H 0x2b |
knaresh89 | 0:cd96b05ace6e | 53 | #define LIS3DH_OUT_Z_L 0x2c |
knaresh89 | 0:cd96b05ace6e | 54 | #define LIS3DH_OUT_Z_H 0x2d |
knaresh89 | 0:cd96b05ace6e | 55 | #define LIS3DH_FIFO_CTRL_REG 0x2e |
knaresh89 | 0:cd96b05ace6e | 56 | #define LIS3DH_FIFO_SRC_REG 0x2f |
knaresh89 | 0:cd96b05ace6e | 57 | #define LIS3DH_INT1_CFG 0x30 |
knaresh89 | 0:cd96b05ace6e | 58 | #define LIS3DH_INT1_SOURCE 0x31 |
knaresh89 | 0:cd96b05ace6e | 59 | #define LIS3DH_INT1_THS 0x32 |
knaresh89 | 0:cd96b05ace6e | 60 | #define LIS3DH_INT1_DURATION 0x33 |
knaresh89 | 0:cd96b05ace6e | 61 | #define LIS3DH_CLICK_CFG 0x38 |
knaresh89 | 0:cd96b05ace6e | 62 | #define LIS3DH_CLICK_SRC 0x39 |
knaresh89 | 0:cd96b05ace6e | 63 | #define LIS3DH_CLICK_THS 0x3a |
knaresh89 | 0:cd96b05ace6e | 64 | #define LIS3DH_TIME_LIMIT 0x3b |
knaresh89 | 0:cd96b05ace6e | 65 | #define LIS3DH_TIME_LATENCY 0x3c |
knaresh89 | 0:cd96b05ace6e | 66 | #define LIS3DH_TIME_WINDOW 0x3d |
knaresh89 | 0:cd96b05ace6e | 67 | |
knaresh89 | 0:cd96b05ace6e | 68 | // Output Data Rate (ODR) |
knaresh89 | 0:cd96b05ace6e | 69 | #define LIS3DH_DR_PWRDWN 0 |
knaresh89 | 0:cd96b05ace6e | 70 | #define LIS3DH_DR_NR_LP_1HZ 1 |
knaresh89 | 0:cd96b05ace6e | 71 | #define LIS3DH_DR_NR_LP_10HZ 2 |
knaresh89 | 0:cd96b05ace6e | 72 | #define LIS3DH_DR_NR_LP_25HZ 3 |
knaresh89 | 0:cd96b05ace6e | 73 | #define LIS3DH_DR_NR_LP_50HZ 4 |
knaresh89 | 0:cd96b05ace6e | 74 | #define LIS3DH_DR_NR_LP_100HZ 5 |
knaresh89 | 0:cd96b05ace6e | 75 | #define LIS3DH_DR_NR_LP_200HZ 6 |
knaresh89 | 0:cd96b05ace6e | 76 | #define LIS3DH_DR_NR_LP_400HZ 7 |
knaresh89 | 0:cd96b05ace6e | 77 | #define LIS3DH_DR_LP_1R6KHZ 8 |
knaresh89 | 0:cd96b05ace6e | 78 | #define LIS3DH_DR_NR_1R25KHZ 9 |
knaresh89 | 0:cd96b05ace6e | 79 | |
knaresh89 | 0:cd96b05ace6e | 80 | // Bandwidth (Low pass) |
knaresh89 | 0:cd96b05ace6e | 81 | #define LIS3DH_BW_LOW 0 |
knaresh89 | 0:cd96b05ace6e | 82 | #define LIS3DH_BW_M_LOW 1 |
knaresh89 | 0:cd96b05ace6e | 83 | #define LIS3DH_BW_M_HI 2 |
knaresh89 | 0:cd96b05ace6e | 84 | #define LIS3DH_BW_HI 3 |
knaresh89 | 0:cd96b05ace6e | 85 | |
knaresh89 | 0:cd96b05ace6e | 86 | // Low power mode enable/disable |
knaresh89 | 0:cd96b05ace6e | 87 | #define LIS3DH_LP_EN 0 |
knaresh89 | 0:cd96b05ace6e | 88 | #define LIS3DH_LP_DIS 1 |
knaresh89 | 0:cd96b05ace6e | 89 | |
knaresh89 | 0:cd96b05ace6e | 90 | // Axis control |
knaresh89 | 0:cd96b05ace6e | 91 | #define LIS3DH_X_EN 1 |
knaresh89 | 0:cd96b05ace6e | 92 | #define LIS3DH_X_DIS 0 |
knaresh89 | 0:cd96b05ace6e | 93 | #define LIS3DH_Y_EN 1 |
knaresh89 | 0:cd96b05ace6e | 94 | #define LIS3DH_Y_DIS 0 |
knaresh89 | 0:cd96b05ace6e | 95 | #define LIS3DH_Z_EN 1 |
knaresh89 | 0:cd96b05ace6e | 96 | #define LIS3DH_Z_DIS 0 |
knaresh89 | 0:cd96b05ace6e | 97 | |
knaresh89 | 0:cd96b05ace6e | 98 | // Full Scale |
knaresh89 | 0:cd96b05ace6e | 99 | #define LIS3DH_FS_2G 0 |
knaresh89 | 0:cd96b05ace6e | 100 | #define LIS3DH_FS_4G 1 |
knaresh89 | 0:cd96b05ace6e | 101 | #define LIS3DH_FS_8G 2 |
knaresh89 | 0:cd96b05ace6e | 102 | #define LIS3DH_FS_16G 3 |
knaresh89 | 0:cd96b05ace6e | 103 | |
knaresh89 | 0:cd96b05ace6e | 104 | // definition for Nomalization |
knaresh89 | 0:cd96b05ace6e | 105 | #if OLD_REV |
knaresh89 | 0:cd96b05ace6e | 106 | #define LIS3DH_SENSITIVITY_2G (0.001F) |
knaresh89 | 0:cd96b05ace6e | 107 | #define LIS3DH_SENSITIVITY_4G (0.002F) |
knaresh89 | 0:cd96b05ace6e | 108 | #define LIS3DH_SENSITIVITY_8G (0.004F) |
knaresh89 | 0:cd96b05ace6e | 109 | #define LIS3DH_SENSITIVITY_16G (0.012F) |
knaresh89 | 0:cd96b05ace6e | 110 | #else |
knaresh89 | 0:cd96b05ace6e | 111 | #define LIS3DH_SENSITIVITY_2G 1 |
knaresh89 | 0:cd96b05ace6e | 112 | #define LIS3DH_SENSITIVITY_4G 2 |
knaresh89 | 0:cd96b05ace6e | 113 | #define LIS3DH_SENSITIVITY_8G 4 |
knaresh89 | 0:cd96b05ace6e | 114 | #define LIS3DH_SENSITIVITY_16G 12 |
knaresh89 | 0:cd96b05ace6e | 115 | #endif |
knaresh89 | 0:cd96b05ace6e | 116 | |
knaresh89 | 0:cd96b05ace6e | 117 | //Gravity at Earth's surface in m/s/s |
knaresh89 | 0:cd96b05ace6e | 118 | #if OLD_REV |
knaresh89 | 0:cd96b05ace6e | 119 | #define GRAVITY (9.80665F) |
knaresh89 | 0:cd96b05ace6e | 120 | #else |
knaresh89 | 0:cd96b05ace6e | 121 | #define GRAVITY (9.80665F / 1000) |
knaresh89 | 0:cd96b05ace6e | 122 | #endif |
knaresh89 | 0:cd96b05ace6e | 123 | |
knaresh89 | 0:cd96b05ace6e | 124 | /** Interface for STMicronics MEMS motion sensor: 3-axis "nano" accelerometer |
knaresh89 | 0:cd96b05ace6e | 125 | * Chip: LIS3DH |
knaresh89 | 0:cd96b05ace6e | 126 | * |
knaresh89 | 0:cd96b05ace6e | 127 | * @code |
knaresh89 | 0:cd96b05ace6e | 128 | * #include "mbed.h" |
knaresh89 | 0:cd96b05ace6e | 129 | * |
knaresh89 | 0:cd96b05ace6e | 130 | * // I2C Communication |
knaresh89 | 0:cd96b05ace6e | 131 | * LIS3DH acc(p_sda, p_scl, chip_addr, datarate, bandwidth, fullscale); |
knaresh89 | 0:cd96b05ace6e | 132 | * // If you connected I2C line not only this device but also other devices, |
knaresh89 | 0:cd96b05ace6e | 133 | * // you need to declare following method. |
knaresh89 | 0:cd96b05ace6e | 134 | * I2C i2c(dp5,dp27); // SDA, SCL |
knaresh89 | 0:cd96b05ace6e | 135 | * LIS3DH acc(i2c, chip_addr, datarate, bandwidth, fullscale); |
knaresh89 | 0:cd96b05ace6e | 136 | * |
knaresh89 | 0:cd96b05ace6e | 137 | * int main() { |
knaresh89 | 0:cd96b05ace6e | 138 | * float f[3]; |
knaresh89 | 0:cd96b05ace6e | 139 | * |
knaresh89 | 0:cd96b05ace6e | 140 | * if (acc.read_id() == I_AM_LIS3DH){ |
knaresh89 | 0:cd96b05ace6e | 141 | * acc.read_data(f); |
knaresh89 | 0:cd96b05ace6e | 142 | * } |
knaresh89 | 0:cd96b05ace6e | 143 | * } |
knaresh89 | 0:cd96b05ace6e | 144 | * @endcode |
knaresh89 | 0:cd96b05ace6e | 145 | */ |
knaresh89 | 0:cd96b05ace6e | 146 | |
knaresh89 | 0:cd96b05ace6e | 147 | class LIS3DH |
knaresh89 | 0:cd96b05ace6e | 148 | { |
knaresh89 | 0:cd96b05ace6e | 149 | public: |
knaresh89 | 0:cd96b05ace6e | 150 | /** Configure data pin |
knaresh89 | 0:cd96b05ace6e | 151 | * @param data SDA and SCL pins |
knaresh89 | 0:cd96b05ace6e | 152 | * @param device address LIS3DH(SA0=0 or 1), LIS3DH_G_CHIP_ADDR or LIS3DH_V_CHIP_ADDR |
knaresh89 | 0:cd96b05ace6e | 153 | * @param output data rate selection, power down mode, 1Hz to 5KHz |
knaresh89 | 0:cd96b05ace6e | 154 | * @param full scale selection, +/-2g to +/-16g |
knaresh89 | 0:cd96b05ace6e | 155 | */ |
knaresh89 | 0:cd96b05ace6e | 156 | LIS3DH(PinName p_sda, PinName p_scl, |
knaresh89 | 0:cd96b05ace6e | 157 | uint8_t addr, uint8_t data_rate, uint8_t fullscale); |
knaresh89 | 0:cd96b05ace6e | 158 | |
knaresh89 | 0:cd96b05ace6e | 159 | /** Configure data pin |
knaresh89 | 0:cd96b05ace6e | 160 | * @param data SDA and SCL pins |
knaresh89 | 0:cd96b05ace6e | 161 | * @param device address LIS3DH(SA0=0 or 1), LIS3DH_G_CHIP_ADDR or LIS3DH_V_CHIP_ADDR |
knaresh89 | 0:cd96b05ace6e | 162 | * @default output data rate selection = 50Hz |
knaresh89 | 0:cd96b05ace6e | 163 | * @default full scale selection = +/-8g |
knaresh89 | 0:cd96b05ace6e | 164 | */ |
knaresh89 | 0:cd96b05ace6e | 165 | LIS3DH(PinName p_sda, PinName p_scl, uint8_t addr); |
knaresh89 | 0:cd96b05ace6e | 166 | |
knaresh89 | 0:cd96b05ace6e | 167 | /** Configure data pin (with other devices on I2C line) |
knaresh89 | 0:cd96b05ace6e | 168 | * @param I2C previous definition |
knaresh89 | 0:cd96b05ace6e | 169 | * @param other parameters -> please see LIS3DH(PinName p_sda, PinName p_scl,...) |
knaresh89 | 0:cd96b05ace6e | 170 | */ |
knaresh89 | 0:cd96b05ace6e | 171 | LIS3DH(I2C& p_i2c, |
knaresh89 | 0:cd96b05ace6e | 172 | uint8_t addr, uint8_t data_rate, uint8_t fullscale); |
knaresh89 | 0:cd96b05ace6e | 173 | |
knaresh89 | 0:cd96b05ace6e | 174 | /** Configure data pin (with other devices on I2C line) |
knaresh89 | 0:cd96b05ace6e | 175 | * @param I2C previous definition |
knaresh89 | 0:cd96b05ace6e | 176 | * @param other parameters -> please see LIS3DH(PinName p_sda, PinName p_scl,...) |
knaresh89 | 0:cd96b05ace6e | 177 | * @default output data rate selection = 50Hz |
knaresh89 | 0:cd96b05ace6e | 178 | * @default full scale selection = +/-8g |
knaresh89 | 0:cd96b05ace6e | 179 | */ |
knaresh89 | 0:cd96b05ace6e | 180 | LIS3DH(I2C& p_i2c, uint8_t addr); |
knaresh89 | 0:cd96b05ace6e | 181 | |
knaresh89 | 0:cd96b05ace6e | 182 | /** Read a float type data from acc |
knaresh89 | 0:cd96b05ace6e | 183 | * @param float type of three arry's address, e.g. float dt_usr[3]; |
knaresh89 | 0:cd96b05ace6e | 184 | * @return acc motion data unit: m/s/s(m/s2) |
knaresh89 | 0:cd96b05ace6e | 185 | * @return dt_usr[0]->x, dt_usr[1]->y, dt_usr[2]->z |
knaresh89 | 0:cd96b05ace6e | 186 | */ |
knaresh89 | 0:cd96b05ace6e | 187 | void read_data(float *dt_usr); |
knaresh89 | 0:cd96b05ace6e | 188 | |
knaresh89 | 0:cd96b05ace6e | 189 | /** Read a float type data from acc |
knaresh89 | 0:cd96b05ace6e | 190 | * @param float type of three arry's address, e.g. float dt_usr[3]; |
knaresh89 | 0:cd96b05ace6e | 191 | * @return acc motion data unit: mg |
knaresh89 | 0:cd96b05ace6e | 192 | * @return dt_usr[0]->x, dt_usr[1]->y, dt_usr[2]->z |
knaresh89 | 0:cd96b05ace6e | 193 | */ |
knaresh89 | 0:cd96b05ace6e | 194 | void read_mg_data(float *dt_usr); |
knaresh89 | 0:cd96b05ace6e | 195 | |
knaresh89 | 0:cd96b05ace6e | 196 | /** Read a acc ID number |
knaresh89 | 0:cd96b05ace6e | 197 | * @param none |
knaresh89 | 0:cd96b05ace6e | 198 | * @return if STM MEMS acc, it should be I_AM_ LIS3DH(0x33) |
knaresh89 | 0:cd96b05ace6e | 199 | */ |
knaresh89 | 0:cd96b05ace6e | 200 | uint8_t read_id(); |
knaresh89 | 0:cd96b05ace6e | 201 | |
knaresh89 | 0:cd96b05ace6e | 202 | /** Read Data Ready flag |
knaresh89 | 0:cd96b05ace6e | 203 | * @param none |
knaresh89 | 0:cd96b05ace6e | 204 | * @return 1 = Ready |
knaresh89 | 0:cd96b05ace6e | 205 | */ |
knaresh89 | 0:cd96b05ace6e | 206 | uint8_t data_ready(); |
knaresh89 | 0:cd96b05ace6e | 207 | |
knaresh89 | 0:cd96b05ace6e | 208 | /** Set I2C clock frequency |
knaresh89 | 0:cd96b05ace6e | 209 | * @param freq. |
knaresh89 | 0:cd96b05ace6e | 210 | * @return none |
knaresh89 | 0:cd96b05ace6e | 211 | */ |
knaresh89 | 0:cd96b05ace6e | 212 | void frequency(int hz); |
knaresh89 | 0:cd96b05ace6e | 213 | |
knaresh89 | 0:cd96b05ace6e | 214 | /** Read register (general purpose) |
knaresh89 | 0:cd96b05ace6e | 215 | * @param register's address |
knaresh89 | 0:cd96b05ace6e | 216 | * @return register data |
knaresh89 | 0:cd96b05ace6e | 217 | */ |
knaresh89 | 0:cd96b05ace6e | 218 | uint8_t read_reg(uint8_t addr); |
knaresh89 | 0:cd96b05ace6e | 219 | |
knaresh89 | 0:cd96b05ace6e | 220 | /** Write register (general purpose) |
knaresh89 | 0:cd96b05ace6e | 221 | * @param register's address |
knaresh89 | 0:cd96b05ace6e | 222 | * @param data |
knaresh89 | 0:cd96b05ace6e | 223 | * @return none |
knaresh89 | 0:cd96b05ace6e | 224 | */ |
knaresh89 | 0:cd96b05ace6e | 225 | void write_reg(uint8_t addr, uint8_t data); |
knaresh89 | 0:cd96b05ace6e | 226 | |
knaresh89 | 0:cd96b05ace6e | 227 | protected: |
knaresh89 | 0:cd96b05ace6e | 228 | void initialize(uint8_t, uint8_t, uint8_t); |
knaresh89 | 0:cd96b05ace6e | 229 | void read_reg_data(char *data); |
knaresh89 | 0:cd96b05ace6e | 230 | |
knaresh89 | 0:cd96b05ace6e | 231 | I2C *_i2c_p; |
knaresh89 | 0:cd96b05ace6e | 232 | I2C &_i2c; |
knaresh89 | 0:cd96b05ace6e | 233 | |
knaresh89 | 0:cd96b05ace6e | 234 | private: |
knaresh89 | 0:cd96b05ace6e | 235 | #if OLD_REV |
knaresh89 | 0:cd96b05ace6e | 236 | float fs_factor; // full scale factor |
knaresh89 | 0:cd96b05ace6e | 237 | #else |
knaresh89 | 0:cd96b05ace6e | 238 | uint8_t fs_factor; // full scale factor |
knaresh89 | 0:cd96b05ace6e | 239 | #endif |
knaresh89 | 0:cd96b05ace6e | 240 | char dt[2]; // working buffer |
knaresh89 | 0:cd96b05ace6e | 241 | uint8_t acc_addr; // acc sensor address |
knaresh89 | 0:cd96b05ace6e | 242 | uint8_t acc_id; // acc ID |
knaresh89 | 0:cd96b05ace6e | 243 | uint8_t acc_ready; // acc is on I2C line = 1, not = 0 |
knaresh89 | 0:cd96b05ace6e | 244 | }; |
knaresh89 | 0:cd96b05ace6e | 245 | |
knaresh89 | 0:cd96b05ace6e | 246 | #endif // LIS3DH_H |
knaresh89 | 0:cd96b05ace6e | 247 |