Commit 098a6b88 authored by Christopher Reis's avatar Christopher Reis

Pulled back all those libraries...too many

Lots of errors
parent c9563b6c
No preview for this file type
http://developer.mbed.org/users/harrypowers/code/BMP180/#01c74f1b5f4d
01c74f1b5f4d3fdd80206eaaf423c412307c0ef1 4
01c74f1b5f4d3fdd80206eaaf423c412307c0ef1 default
4 01c74f1b5f4d3fdd80206eaaf423c412307c0ef1
[paths]
default = http://developer.mbed.org/users/harrypowers/code/BMP180/
revlogv1
fncache
store
dotencode
data/BMP180.cpp.i
data/BMP180.h.i
default
\ No newline at end of file
0
pull
http://developer.mbed.org/users/harrypowers/code/BMP180/
syntax: regexp
\.hgignore$
\.git$
\.svn$
\.orig$
\.msub$
\.meta$
\.ctags
\.uvproj$
\.uvopt$
\.project$
\.cproject$
\.launch$
\.project$
\.cproject$
\.launch$
Makefile$
\.ewp$
\.eww$
\ No newline at end of file
#include "BMP180.h"
BMP180::BMP180(PinName sda, PinName scl) : bmp180i2c(sda,scl)
{
bmp180i2c.frequency(BMP180FREQ);
oversampling_setting = OVERSAMPLING_HIGH_RESOLUTION;
rReg[0] = 0;
rReg[1] = 0;
rReg[2] = 0;
wReg[0] = 0;
wReg[1] = 0;
w[0] = 0xF4;
w[1] = 0xF4;
cmd = CMD_READ_CALIBRATION; // EEPROM calibration command
for (int i = 0; i < EEprom; i++) { // read the 22 registers of the EEPROM
bmp180i2c.write(BMP180ADDR, &cmd, 1);
bmp180i2c.read(BMP180ADDR, rReg, 1);
data[i] = rReg[0];
cmd += 1;
wait_ms(10);
}
// parameters AC1-AC6
//The calibration is partioned in 11 words of 16 bits, each of them representing a coefficient
ac1 = (data[0] <<8) | data[1]; // AC1(0xAA, 0xAB)... and so on
ac2 = (data[2] <<8) | data[3];
ac3 = (data[4] <<8) | data[5];
ac4 = (data[6] <<8) | data[7];
ac5 = (data[8] <<8) | data[9];
ac6 = (data[10] <<8) | data[11];
// parameters B1,B2
b1 = (data[12] <<8) | data[13];
b2 = (data[14] <<8) | data[15];
// parameters MB,MC,MD
mb = (data[16] <<8) | data[17];
mc = (data[18] <<8) | data[19];
md = (data[20] <<8) | data[21];
}
BMP180::~BMP180()
{
}
int BMP180::startTemperature() // Start temperature measurement
{
int errors = 0;
errors += bmp180i2c.write(BMP180ADDR, w, 2);
wReg[0] = 0xF4;
wReg[1] = 0x2E;
errors += bmp180i2c.write(BMP180ADDR, wReg, 2); // write 0x2E in reg 0XF4
return(errors);
}
int BMP180::readTemperature(long *t) // Get the temperature reading that was taken in startTemperature() but ensure 4.5 ms time has elapsed
{
int errors = 0;
rReg[0] = 0;
rReg[1] = 0;
rReg[2] = 0;
cmd = CMD_READ_VALUE; // 0xF6
errors += bmp180i2c.write(BMP180ADDR, &cmd, 1); // set pointer on 0xF6 before reading it?
errors += bmp180i2c.read(BMP180ADDR, rReg, 2); // read 0xF6 (MSB) and 0xF7 (LSB)// rReg is 3 long though
*t = (rReg[0] << 8) | rReg[1]; // UT = MSB << 8 + LSB
x1 = (((long) *t - (long) ac6) * (long) ac5) >> 15; // aka (ut-ac6) * ac5/pow(2,15)
x2 = ((long) mc << 11) / (x1 + md); // aka mc * pow(2, 11) / (x1 + md)
b5 = x1 + x2;
*t = ((b5 + 8) >> 4); // (b5+8)/pow(2, 4)
return(errors);
}
int BMP180::startPressure(int oversample) // Start pressure measurement! Note oversample will vary the time to complete this measurement. See defines above for oversampling constants to use!
{
int errors = 0;
oversampling_setting = BMP180::oversampleCheck(oversample);
int uncomp_pressure_cmd = 0x34 + (oversampling_setting<<6);
errors = bmp180i2c.write(BMP180ADDR, w, 2);
wReg[0] = 0xF4;
wReg[1] = uncomp_pressure_cmd;
errors += bmp180i2c.write(BMP180ADDR, wReg, 2);
return(errors);
}
int BMP180::readPressure(long *p) // Get the pressure reading that was taken in startPressure() but ensure time for the measurement to complete
{
int errors = 0;
rReg[0] = 0;
rReg[1] = 0;
rReg[2] = 0;
cmd = CMD_READ_VALUE; // 0xF6
errors += bmp180i2c.write(BMP180ADDR, &cmd, 1);
errors += bmp180i2c.read(BMP180ADDR, rReg, 3); // read 0xF6 (MSB), 0xF7 (LSB), 0xF8 (XLSB)
*p = ((rReg[0] << 16) | (rReg[1] << 8) | rReg[2]) >> (8 - oversampling_setting);
b6 = b5 - 4000; // realize b5 is set in readTemperature() function so that needs to be done first before this function!
x1 = (b6*b6) >> 12; // full formula(b2*(b6*b6)/pow(2,12))/pow(2,11)
x1 *= b2;
x1 >>= 11;
x2 = (ac2*b6);
x2 >>= 11;
x3 = x1 + x2;
b3 = (((((long)ac1 )*4 + x3) <<oversampling_setting) + 2) >> 2;
x1 = (ac3* b6) >> 13;
x2 = (b1 * ((b6*b6) >> 12) ) >> 16;
x3 = ((x1 + x2) + 2) >> 2;
b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
b7 = ((unsigned long) *p - b3) * (50000>>oversampling_setting);
if (b7 < 0x80000000) {
*p = (b7 << 1) / b4;
} else {
*p = (b7 / b4) << 1;
}
x1 = *p >> 8;
x1 *= x1; // pressure/pow(2,8) * pressure/pow(2, 8)
x1 = (x1 * 3038) >> 16;
x2 = ( *p * -7357) >> 16;
*p += (x1 + x2 + 3791) >> 4; // pressure in Pa
return(errors);
}
int BMP180::readTP(long *t, long *p, int oversample) // get both temperature and pressure calculations that are compensated
{
int errors = 0;
errors += BMP180::startTemperature();
wait_ms(4.5);
errors += BMP180::readTemperature(t);
errors += BMP180::startPressure(oversample);
switch (oversample) {
case OVERSAMPLING_ULTRA_LOW_POWER:
wait_ms(4.5);
break;
case OVERSAMPLING_STANDARD:
wait_ms(7.5);
break;
case OVERSAMPLING_HIGH_RESOLUTION:
wait_ms(13.5);
break;
case OVERSAMPLING_ULTRA_HIGH_RESOLUTION:
wait_ms(25.5);
break;
}
errors += BMP180::readPressure(p);
return(errors);
}
int BMP180::oversampleCheck(int oversample)
{
switch(oversample) {
case OVERSAMPLING_ULTRA_LOW_POWER:
break;
case OVERSAMPLING_STANDARD:
break;
case OVERSAMPLING_HIGH_RESOLUTION:
break;
case OVERSAMPLING_ULTRA_HIGH_RESOLUTION:
break;
default:
oversample = OVERSAMPLING_ULTRA_HIGH_RESOLUTION;
break;
}
return(oversample);
}
\ No newline at end of file
#ifndef BMP180_H
#define BMP180_H
/* BMP180 Digital Pressure Sensor Class for use with Mbed LPC1768 and other platforms
* BMP180 from Bosch Sensortec
* Copyright (c) 2013 Philip King Smith
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* Bosch data sheet at: http://ae-bst.resource.bosch.com/media/products/dokumente/bmp180/BST-BMP180-DS000-09.pdf
* Some parts of the calculations used are infact from Rom Clement published Mbed code here: https://mbed.org/users/Rom/code/Barometer_bmp085/
* I only used snippets of the Rom's code because i was making this into a class and so this is structured totaly different then his code example is.
* I also used the Bosch data sheet showing the calculations and adjusted everything accordingly!
*/
#include "mbed.h"
#define EEprom 22 // The EEPROM has 176bits of calibration data (176/8 = 22 Bytes)
#define BMP180ADDR 0xEF // I2C address of BMP180 device
#define BMP180FREQ 1000000 // Data sheet says 3.4 MHz is max but not sure what mbed can do here!
#define CMD_READ_VALUE 0xF6
#define CMD_READ_CALIBRATION 0xAA
#define OVERSAMPLING_ULTRA_LOW_POWER 0 // these are the constants used in the oversample variable in the below code!
#define OVERSAMPLING_STANDARD 1
#define OVERSAMPLING_HIGH_RESOLUTION 2
#define OVERSAMPLING_ULTRA_HIGH_RESOLUTION 3
/** BMP180 Digital Pressure Sensor class using mbed's i2c class
*
* Example:
* @code
* // show how the BMP180 class works
* #include "mbed.h"
* #include "BMP180.h"
*
* int main()
* {
*
* long temp ;
* long pressure;
* int error ;
* BMP180 mybmp180(p9,p10);
* while(1) {
* error = mybmp180.readTP(&temp,&pressure,OVERSAMPLING_ULTRA_HIGH_RESOLUTION);
* printf("Temp is %ld\r\n",temp);
* printf("Pressure is %ld\r\n",pressure);
* printf("Error is %d\r\n\r\n",error);
* wait(2);
* }
* }
* @endcode
*/
class BMP180
{
public:
/** Create object connected to BMP180 pins ( remember both pins need pull up resisters)
*
* Ensure the pull up resistors are used on these pins. Also note there is no checking on
* if you use these pins p9, p10, p27, p28 so ensure you only use these ones on the LPC1768 device
*
* @param sda pin that BMP180 connected to (p9 or p28 as defined on LPC1768)
* @param slc pin that BMP180 connected to (p10 or p27 ad defined on LPC1768)
*/
BMP180(PinName sda, PinName slc); // Constructor
~BMP180(); // Destructor
/** Read Temperature and Pressure at the same time
*
* This function will only return when it has readings. This means that the time will vary depending on oversample setting!
* Note if your code can not wait for these readings to be taken and calculated you should use the functions below.
* These other functions are designed to allow your code to do other things then get the final readings.
* This function is only designed as a one shot give me the answer function.
*
* @param t the temperature fully compensated value is returned in this variable. Degrees celsius with one decimal so 253 is 25.3 C.
* @param p the barometric pressure fully compensated value is returned in this variable. Pressure is in Pa so 88007 is 88.007 kPa.
* @param oversample is the method method for reading sensor. OVERSAMPLING_ULTRA_HIGH_RESOLUTION is used if an incorrect value is passed to this function.
* @param returns 0 for no errors during i2c communication. Any other number is just a i2c communication failure of some kind!
*/
int readTP(long *t, long *p, int oversample); // get both temperature and pressure fully compensated values! Note this only returns when measurements are complete
/** Start the temperature reading process but return after the commands are issued to BMP180
*
* This function is ment to start the temperature reading process but will return to allow other code to run then a reading could be made at a later time.
* Note the maximum time needed for this measurment is 4.5 ms.
*
* @param returns 0 for no errors during i2c communication. Any other number is just a i2c communication failure of some kind!
*/
int startTemperature(); // Start temperature measurement
/** Reads the last temperature reading that was started with startTemperature() function
*
* This function will return the fully compensated value of the temperature in Degrees celsius with one decimal so 253 is 25.3 C.
* Note this function should normaly follow the startTemperature() function and should also preceed the startPressure() and readPressure() commands!
* Note this function should follow startTemperature() after 4.5 ms minimum has elapsed or reading will be incorrect.
*
* @param t the temperature fully compensated value is returned in this variable.
* @param returns 0 for no errors during i2c communication. Any other number is just a i2c communication failure of some kind!
*/
int readTemperature(long *t); // Get the temperature reading that was taken in startTemperature() but ensure 4.5 ms time has elapsed
/** Start the pressure reading process but return after the commands are issued to BMP180
*
* This function is ment to start the pressure reading process but will return to allow other code to run then a reading could be made at a later time.
* Note the time needed for this reading pressure process will depend on oversample setting. The maximum time is 25.5 ms and minimum time is 4.5 ms.
*
* @param oversample is the method for reading sensor. OVERSAMPLING_ULTRA_HIGH_RESOLUTION is used if an incorrect value is passed to this function.
* @param returns 0 for no errors during i2c communication. Any other number is just a i2c communication failure of some kind!
*/
int startPressure(int oversample); // Start pressure measurement! Note oversample will vary the time to complete this measurement. See defines above for oversampling constants to use!
/** Reads the last barometric pressure reading that was started with startPressure() function
*
* This function will return the fully compensated value of the barometric pressure in Pa.
* Note this function should follow startPressure() after the time needed to read the pressure. This time will vary but maximum time is 25.5 ms and minimum time is 4.5 ms.
* Note that this reading is dependent on temperature so the startTemperature() and readTemperature() functions should proceed this function or the pressure value will be incorrect!
*
* @param p the barometric pressure fully compensated value is returned in this variable. Pressure is in Pa so 88007 is 88.007 kPa.
* @param returns 0 for no errors during i2c communication. Any other number is just a i2c communication failure of some kind!
*/
int readPressure(long *p); // Get the pressure reading that was taken in startPressure() but ensure time for the measurement to complete
protected:
long x1;
long x2;
long x3;
short ac1;
short ac2;
short ac3;
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
short b1;
short b2;
long b3;
unsigned long b4;
long b5;
long b6;
unsigned long b7;
short mb;
short mc;
short md;
int oversampling_setting;
char rReg[3];
char wReg[2];
char cmd;
char data[EEprom];
char w[2];
I2C bmp180i2c; // the I2C class for this bmp180 communication.
int oversampleCheck(int oversample);
};
#endif
\ No newline at end of file
http://developer.mbed.org/users/clemente/code/MPL3115A2/#82ac06669316
82ac06669316f85ebacbb6f76809094a3a856708 10
82ac06669316f85ebacbb6f76809094a3a856708 default
10 82ac06669316f85ebacbb6f76809094a3a856708
[paths]
default = http://developer.mbed.org/users/clemente/code/MPL3115A2/
revlogv1
fncache
store
dotencode
data/MPL3115A2.h.i
data/MPL3115A2.cpp.i
default
\ No newline at end of file
0
pull
http://developer.mbed.org/users/clemente/code/MPL3115A2/
syntax: regexp
\.hgignore$
\.git$
\.svn$
\.orig$
\.msub$
\.meta$
\.ctags
\.uvproj$
\.uvopt$
\.project$
\.cproject$
\.launch$
\.project$
\.cproject$
\.launch$
Makefile$
\.ewp$
\.eww$
\ No newline at end of file
This diff is collapsed.
#ifndef MPL3115A2_H
#define MPL3115A2_H
#include "mbed.h"
// Oversampling value and minimum time between sample
#define OVERSAMPLE_RATIO_1 0 // 6 ms
#define OVERSAMPLE_RATIO_2 1 // 10 ms
#define OVERSAMPLE_RATIO_4 2 // 18 ms
#define OVERSAMPLE_RATIO_8 3 // 34 ms
#define OVERSAMPLE_RATIO_16 4 // 66 ms
#define OVERSAMPLE_RATIO_32 5 // 130 ms
#define OVERSAMPLE_RATIO_64 6 // 258 ms
#define OVERSAMPLE_RATIO_128 7 // 512 ms
/* Mode */
#define ALTIMETER_MODE 1
#define BAROMETRIC_MODE 2
/**
* MPL3115A2 Altimeter example
*
* @code
* #include "mbed.h"
* #include "MPL3115A2.h"
*
* #define MPL3115A2_I2C_ADDRESS (0x60<<1)
* MPL3115A2 wigo_sensor1(PTE0, PTE1, MPL3115A2_I2C_ADDRESS);
* Serial pc(USBTX, USBRX);
*
* // pos [0] = altitude or pressure value
* // pos [1] = temperature value
* float sensor_data[2];
*
* int main(void) {
*
* pc.baud( 230400);
* pc.printf("MPL3115A2 Altimeter mode. [%d]\r\n", wigo_sensor1.getDeviceID());
*
* wigo_sensor1.Oversample_Ratio( OVERSAMPLE_RATIO_32);
*
* while(1) {
* //
* if ( wigo_sensor1.isDataAvailable()) {
* wigo_sensor1.getAllData( &sensor_data[0]);
* pc.printf("\tAltitude: %f\tTemperature: %f\r\n", sensor_data[0], sensor_data[1]);
* }
* //
* wait( 0.001);
* }
*
* }
* @endcode
*/
class MPL3115A2
{
public:
/**
* MPL3115A2 constructor
*
* @param sda SDA pin
* @param sdl SCL pin
* @param addr addr of the I2C peripheral
*/
MPL3115A2(PinName sda, PinName scl, int addr);
/**
* Get the value of the WHO_AM_I register
*
* @returns DEVICE_ID value == 0xC4
*/
uint8_t getDeviceID();
/**
* Return the STATUS register value
*
* @returns STATUS register value
*/
unsigned char getStatus( void);
/**
* Get the altimeter value
*
* @returns altimeter value as float
*/
float getAltimeter( void);
/**
* Get the altimeter value in raw mode
*
* @param dt pointer to unsigned char array
* @returns 1 if data are available, 0 if not.
*/
unsigned int getAltimeterRaw( unsigned char *dt);
/**
* Get the pressure value
*
* @returns pressure value as float
*/
float getPressure( void);
/**
* Get the pressure value in raw mode
*
* @param dt pointer to unsigned char array
* @returns 1 if data are available, 0 if not.
*/
unsigned int getPressureRaw( unsigned char *dt);
/**
* Get the temperature value
*
* @returns temperature value as float
*/
float getTemperature( void);
/**
* Get the temperature value in raw mode
*
* @param dt pointer to unsigned char array
* @returns 1 if data are available, 0 if not.
*/
unsigned int getTemperatureRaw( unsigned char *dt);
/**
* Set the Altimeter Mode
*
* @returns none
*/
void Altimeter_Mode( void);
/**
* Set the Barometric Mode
*
* @returns none
*/
void Barometric_Mode( void);
/**
* Get the altimeter or pressure and temperature values
*
* @param array of float f[2]
* @returns 0 no data available, 1 for data available
*/
unsigned int getAllData( float *f);
/**
* Get the altimeter or pressure and temperature values and the delta values
*
* @param array of float f[2], array of float d[2]
* @returns 0 no data available, 1 for data available
*/
unsigned int getAllData( float *f, float *d);
/**
* Get the altimeter or pressure and temperature captured maximum value
*
* @param array of float f[2]
* @returns 0 no data available, 1 for data available
*/
void getAllMaximumData( float *f);
/**
* Get the altimeter or pressure and temperature captured minimum value
*
* @param array of float f[2]
* @returns 0 no data available, 1 for data available
*/
void getAllMinimumData( float *f);
/**
* Get the altimeter or pressure, and temperature values in raw mode
*
* @param array of unsigned char[5]
* @returns 1 if data are available, 0 if not.
*/
unsigned int getAllDataRaw( unsigned char *dt);
/**
* Return if there are date available
*
* @return 0 for no data available, bit0 set for Temp data available, bit1 set for Press/Alti data available
* bit2 set for both Temp and Press/Alti data available
*/
unsigned int isDataAvailable( void);
/**
* Set the oversampling rate value
*
* @param oversampling values. See MPL3115A2.h
* @return none
*/
void Oversample_Ratio( unsigned int ratio);
/**
* Configure the sensor to streaming data using Interrupt
*
* @param user functin callback, oversampling values. See MPL3115A2.h
* @return none
*/
void DataReady( void(*fptr)(void), unsigned char OS);
/**
* Configure the sensor to generate an Interrupt crossing the center threshold
*
* @param user functin callback, level in meter
* @return none
*/
void AltitudeTrigger( void(*fptr)(void), unsigned short level);
/**
* Soft Reset
*
* @param none
* @return none
*/
void Reset( void);
/**
* Configure the Pressure offset.
* Pressure user accessible offset trim value expressed as an 8-bit 2's complement number.
* The user offset registers may be adjusted to enhance accuracy and optimize the system performance.
* Range is from -512 to +508 Pa, 4 Pa per LSB.
* In RAW output mode no scaling or offsets will be applied in the digital domain
*
* @param offset
* @return none
*/
void SetPressureOffset( char offset);
/**
* Configure the Temperature offset.
* Temperature user accessible offset trim value expressed as an 8-bit 2's complement number.
* The user offset registers may be adjusted to enhance accuracy and optimize the system performance.
* Range is from -8 to +7.9375°C 0.0625°C per LSB.
* In RAW output mode no scaling or offsets will be applied in the digital domain
*
* @param offset
* @return none
*/
void SetTemperatureOffset( char offset);
/**
* Configure the Altitude offset.
* Altitude Data User Offset Register (OFF_H) is expressed as a 2’s complement number in meters.
* The user offset register provides user adjustment to the vertical height of the Altitude output.
* The range of values are from -128 to +127 meters.
* In RAW output mode no scaling or offsets will be applied in the digital domain
*
* @param offset
* @return none
*/
void SetAltitudeOffset( char offset);
private:
I2C m_i2c;
int m_addr;
unsigned char MPL3115A2_mode;
unsigned char MPL3115A2_oversampling;
void DataReady_IRQ( void);
void AltitudeTrg_IRQ( void);
/** Set the device in active mode
*/
void Active( void);
/** Set the device in standby mode
*/
void Standby( void);
/** Get the altimiter value from the sensor.
*
* @param reg the register from which read the data.
* Can be: REG_ALTIMETER_MSB for altimeter value
* REG_ALTI_MIN_MSB for the minimum value captured
* REG_ALTI_MAX_MSB for the maximum value captured
*/
float getAltimeter( unsigned char reg);
/** Get the pressure value from the sensor.
*
* @param reg the register from which read the data.
* Can be: REG_PRESSURE_MSB for altimeter value
* REG_PRES_MIN_MSB for the minimum value captured
* REG_PRES_MAX_MSB for the maximum value captured
*/
float getPressure( unsigned char reg);
/** Get the altimiter value from the sensor.
*
* @param reg the register from which read the data.
* Can be: REG_TEMP_MSB for altimeter value
* REG_TEMP_MIN_MSB for the minimum value captured
* REG_TEMP_MAX_MSB for the maximum value captured
*/
float getTemperature( unsigned char reg);
void readRegs(int addr, uint8_t * data, int len);
void writeRegs(uint8_t * data, int len);
};
#endif
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment