Working communication with the BARO
Not a full implementation just a test that can get conntact with the BARO and no other calculations are made. This is not using the HAL but its a software implementation that simly sets pins high and low etc...
This commit is contained in:
parent
e75e8a7089
commit
f35617c92d
@ -57,20 +57,20 @@ bool i2c_configure(I2C_TypeDef *i2c,
|
||||
GPIO_InitStruct.Pin = sda_pin | scl_pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
|
||||
GPIO_InitStruct.Alternate = i2c_af;
|
||||
HAL_GPIO_Init(i2c_port, &GPIO_InitStruct);
|
||||
|
||||
//Initialize I2C communication
|
||||
out_profile->Instance = i2c;
|
||||
out_profile->Init.ClockSpeed = 400000;
|
||||
out_profile->Init.DutyCycle = I2C_DUTYCYCLE_2;
|
||||
out_profile->Init.DutyCycle = I2C_DUTYCYCLE_2/*I2C_DUTYCYCLE_2*/;
|
||||
out_profile->Init.OwnAddress1 = my_address;
|
||||
out_profile->Init.OwnAddress2 = 0;
|
||||
out_profile->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
||||
out_profile->Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
|
||||
out_profile->Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
|
||||
out_profile->Init.NoStretchMode = I2C_NOSTRETCH_ENABLE;
|
||||
out_profile->Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
|
||||
if(HAL_I2C_Init(out_profile) != HAL_OK)
|
||||
return false;
|
||||
|
||||
@ -118,10 +118,10 @@ bool i2c_send(I2C_HandleTypeDef* profile,
|
||||
uint8_t i = 0;
|
||||
// try to send the data 10 times and if no acknowledge is received during these 10 messages we stop trying so that
|
||||
// the system don't gets stuck forever because a slave is unreachable
|
||||
// while(HAL_I2C_Master_Transmit(profile,(slave_address << 1), (uint8_t*)data, length, 1000) != HAL_OK && i++ < 10)
|
||||
// {}
|
||||
while(HAL_I2C_Master_Transmit(profile, slave_address, (uint8_t*)data, length, 5000) != HAL_OK && i++ < 10)
|
||||
{}
|
||||
while(HAL_I2C_Master_Transmit(profile,(slave_address << 1), (uint8_t*)data, length, 1000) != HAL_OK && i++ < 10)
|
||||
{I2C1->CR1 |= (1 << 9);}
|
||||
// while(HAL_I2C_Master_Transmit(profile, slave_address, (uint8_t*)data, length, 5000) != HAL_OK && i++ < 10)
|
||||
// {}
|
||||
|
||||
//Wait til the I2C bus is done with all sending
|
||||
while (HAL_I2C_GetState(profile) != HAL_I2C_STATE_READY){}
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
#define ADDR_WRITE 0xEE // Module address write mode
|
||||
#define ADDR_READ 0xEF // Module address read mode
|
||||
#define ADDRESS_BARO 0x76 //0x77
|
||||
#define ADDRESS_BARO 0x77 //0x77
|
||||
|
||||
#define CMD_RESET 0x1E // ADC reset command
|
||||
#define CMD_ADC_READ 0x00 // ADC read command
|
||||
@ -27,6 +27,9 @@
|
||||
|
||||
#define Device_address_1 0x56
|
||||
|
||||
#define IO_CONFIG(mode, speed) ((mode) | (speed))
|
||||
#define IOCFG_OUT_OD IO_CONFIG(GPIO_Mode_Out_OD, GPIO_Speed_2MHz)
|
||||
|
||||
I2C_HandleTypeDef baroI2C_handle;
|
||||
|
||||
double baro_Preassure; // compensated pressure value (mB)
|
||||
@ -41,6 +44,212 @@ uint8_t cobuf[3];
|
||||
* address: 7 = serial code and CRC */
|
||||
uint32_t coefficients_arr[8]; //coefficient storage
|
||||
|
||||
void IOHi(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
|
||||
{
|
||||
HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_SET);
|
||||
}
|
||||
|
||||
void IOLo(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
|
||||
{
|
||||
HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET);
|
||||
}
|
||||
|
||||
bool IORead(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
|
||||
{
|
||||
return !! (GPIOx->IDR & GPIO_Pin);
|
||||
}
|
||||
|
||||
static void TEST_I2C_delay(void)
|
||||
{
|
||||
volatile int i = 7;
|
||||
while (i) {
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
void TEST_i2cInit()
|
||||
{
|
||||
|
||||
// scl = IOGetByTag(IO_TAG(SOFT_I2C_SCL));
|
||||
// sda = IOGetByTag(IO_TAG(SOFT_I2C_SDA));
|
||||
//
|
||||
// IOConfigGPIO(scl, IOCFG_OUT_OD);
|
||||
// IOConfigGPIO(sda, IOCFG_OUT_OD);
|
||||
}
|
||||
|
||||
static bool TEST_I2C_Start(void)
|
||||
{
|
||||
IOHi(I2C1_PORT, I2C1_SDA_PIN);
|
||||
IOHi(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
if (!IORead(I2C1_PORT, I2C1_SDA_PIN)) {
|
||||
return false;
|
||||
}
|
||||
IOLo(I2C1_PORT, I2C1_SDA_PIN);
|
||||
TEST_I2C_delay();
|
||||
if (IORead(I2C1_PORT, I2C1_SDA_PIN)) {
|
||||
return false;
|
||||
}
|
||||
IOLo(I2C1_PORT, I2C1_SDA_PIN);
|
||||
TEST_I2C_delay();
|
||||
return true;
|
||||
}
|
||||
|
||||
static void TEST_I2C_Stop(void)
|
||||
{
|
||||
IOLo(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
IOLo(I2C1_PORT, I2C1_SDA_PIN);
|
||||
TEST_I2C_delay();
|
||||
IOHi(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
IOHi(I2C1_PORT, I2C1_SDA_PIN);
|
||||
TEST_I2C_delay();
|
||||
}
|
||||
|
||||
static void TEST_I2C_Ack(void)
|
||||
{
|
||||
IOLo(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
IOLo(I2C1_PORT, I2C1_SDA_PIN);
|
||||
TEST_I2C_delay();
|
||||
IOHi(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
IOLo(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
}
|
||||
|
||||
static void TEST_I2C_NoAck(void)
|
||||
{
|
||||
IOLo(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
IOHi(I2C1_PORT, I2C1_SDA_PIN);
|
||||
TEST_I2C_delay();
|
||||
IOHi(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
IOLo(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
}
|
||||
|
||||
static bool TEST_I2C_WaitAck(void)
|
||||
{
|
||||
IOLo(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
IOHi(I2C1_PORT, I2C1_SDA_PIN);
|
||||
TEST_I2C_delay();
|
||||
IOHi(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
if (IORead(I2C1_PORT, I2C1_SDA_PIN)) {
|
||||
IOLo(I2C1_PORT, I2C1_SCL_PIN);
|
||||
return false;
|
||||
}
|
||||
IOLo(I2C1_PORT, I2C1_SCL_PIN);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void TEST_I2C_SendByte(uint8_t byte)
|
||||
{
|
||||
uint8_t i = 8;
|
||||
while (i--) {
|
||||
IOLo(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
if (byte & 0x80) {
|
||||
IOHi(I2C1_PORT, I2C1_SDA_PIN);
|
||||
}
|
||||
else {
|
||||
IOLo(I2C1_PORT, I2C1_SDA_PIN);
|
||||
}
|
||||
byte <<= 1;
|
||||
TEST_I2C_delay();
|
||||
IOHi(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
}
|
||||
IOLo(I2C1_PORT, I2C1_SCL_PIN);
|
||||
}
|
||||
|
||||
static uint8_t TEST_I2C_ReceiveByte(void)
|
||||
{
|
||||
uint8_t i = 8;
|
||||
uint8_t byte = 0;
|
||||
|
||||
IOHi(I2C1_PORT, I2C1_SDA_PIN);
|
||||
while (i--) {
|
||||
byte <<= 1;
|
||||
IOLo(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
IOHi(I2C1_PORT, I2C1_SCL_PIN);
|
||||
TEST_I2C_delay();
|
||||
if (IORead(I2C1_PORT, I2C1_SDA_PIN)) {
|
||||
byte |= 0x01;
|
||||
}
|
||||
}
|
||||
IOLo(I2C1_PORT, I2C1_SCL_PIN);
|
||||
return byte;
|
||||
}
|
||||
|
||||
bool TEST_i2cRead(I2C_HandleTypeDef *hi2c, uint8_t addr, uint8_t reg, uint8_t len, uint8_t *buf)
|
||||
{
|
||||
//just send the addres 0x77
|
||||
//write = 0, read = 1
|
||||
|
||||
if (!TEST_I2C_Start()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
TEST_I2C_SendByte(addr << 1 | 0);
|
||||
if (!TEST_I2C_WaitAck()) {
|
||||
TEST_I2C_Stop();
|
||||
//i2cErrorCount++;
|
||||
return false;
|
||||
}
|
||||
TEST_I2C_SendByte(reg);
|
||||
TEST_I2C_WaitAck();
|
||||
TEST_I2C_Start();
|
||||
TEST_I2C_SendByte(addr << 1 | 1);
|
||||
TEST_I2C_WaitAck();
|
||||
while (len) {
|
||||
*buf = TEST_I2C_ReceiveByte();
|
||||
if (len == 1) {
|
||||
TEST_I2C_NoAck();
|
||||
}
|
||||
else {
|
||||
TEST_I2C_Ack();
|
||||
}
|
||||
buf++;
|
||||
len--;
|
||||
}
|
||||
TEST_I2C_Stop();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TEST_i2cWrite(I2C_HandleTypeDef *hi2c, uint8_t addr, uint8_t reg, uint8_t data, uint8_t readWrite)
|
||||
{
|
||||
//just send the addres 0x77
|
||||
//write = 0, read = 1
|
||||
|
||||
if (!TEST_I2C_Start()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
TEST_I2C_SendByte(addr << 1 | 0);
|
||||
if (!TEST_I2C_WaitAck()) {
|
||||
TEST_I2C_Stop();
|
||||
// i2cErrorCount++;
|
||||
return false;
|
||||
}
|
||||
TEST_I2C_SendByte(reg);
|
||||
TEST_I2C_WaitAck();
|
||||
TEST_I2C_SendByte(data);
|
||||
TEST_I2C_WaitAck();
|
||||
TEST_I2C_Stop();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
uint8_t crc4(uint32_t n_prom[]) {
|
||||
uint32_t n_rem;
|
||||
@ -74,8 +283,8 @@ unsigned int barometer_cmd_prom(char coef_num)
|
||||
unsigned int rC = 0;
|
||||
cobuf[0] = 0;
|
||||
cobuf[1] = 0;
|
||||
//i2c_send(&baroI2C_handle, ADDRESS_BARO, CMD_PROM_RD + coef_num * 2, 1); // send PROM READ command
|
||||
m_i2c_send(CMD_PROM_RD + coef_num * 2); // send PROM READ command
|
||||
i2c_send(&baroI2C_handle, ADDRESS_BARO, CMD_PROM_RD + coef_num * 2, 1); // send PROM READ command
|
||||
//m_i2c_send(CMD_PROM_RD + coef_num * 2); // send PROM READ command
|
||||
i2c_receive(&baroI2C_handle, ADDRESS_BARO, cobuf, 3); //Read the adc values
|
||||
rC = cobuf[0] * 256 + cobuf[1];
|
||||
return rC;
|
||||
@ -120,18 +329,133 @@ void m_i2c_send(uint8_t cmd)
|
||||
|
||||
bool barometer_init()
|
||||
{
|
||||
//i2c_configure(I2C1, &baroI2C_handle, Device_address_1);
|
||||
//Initialize pins for SCL and SDA
|
||||
GPIO_InitTypeDef GPIO_InitStruct;
|
||||
GPIO_InitStruct.Pin = I2C1_SCL_PIN | I2C1_SDA_PIN;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
|
||||
HAL_GPIO_Init(I2C1_PORT, &GPIO_InitStruct);
|
||||
|
||||
bool ack = false;
|
||||
uint8_t sig;
|
||||
// ack = TEST_i2cRead(I2C1, ADDRESS_BARO, CMD_PROM_RD, 1, &sig);
|
||||
// if (!ack)
|
||||
// return false;
|
||||
|
||||
TEST_i2cWrite(I2C1, ADDRESS_BARO, CMD_RESET, 1, 0);
|
||||
HAL_Delay(2800);
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
uint8_t rxbuf[2] = { 0, 0 };
|
||||
TEST_i2cRead(I2C1, ADDRESS_BARO, CMD_PROM_RD + i * 2, 2, rxbuf); // send PROM READ command
|
||||
coefficients_arr[i] = rxbuf[0] << 8 | rxbuf[1];
|
||||
}
|
||||
|
||||
|
||||
HAL_GPIO_DeInit(I2C1_PORT, I2C1_SCL_PIN);
|
||||
HAL_GPIO_DeInit(I2C1_PORT, I2C1_SDA_PIN);
|
||||
|
||||
|
||||
return i2c_configure(I2C1, &baroI2C_handle, Device_address_1);
|
||||
}
|
||||
|
||||
bool barometer_reset()
|
||||
{
|
||||
|
||||
|
||||
//Change to write mode and send reset command
|
||||
cobuf[0] = CMD_RESET;
|
||||
HAL_Delay(1000);
|
||||
bool response = i2c_send(&baroI2C_handle, ADDR_WRITE, (uint8_t*)cobuf[0], 1);
|
||||
m_i2c_send(CMD_RESET);
|
||||
m_i2c_send(CMD_RESET);
|
||||
m_i2c_send(CMD_RESET);
|
||||
//ool response = i2c_send(&baroI2C_handle, ADDRESS_BARO, (uint8_t*)cobuf[0], 1);
|
||||
int i = 0;
|
||||
uint32_t TempaddressW = 0b11101110;
|
||||
uint32_t TempaddressR = 0b11101110;
|
||||
uint32_t testValueW = ((uint8_t)((TempaddressW) & (~0x00000001U)));
|
||||
uint32_t testValR = ((uint8_t)((TempaddressR) | 0x00000001U));
|
||||
|
||||
HAL_I2C_Master_Transmit(&baroI2C_handle,TempaddressW,cobuf, 1,1000);
|
||||
|
||||
// for (i = 0; i < 256; i ++)
|
||||
// {
|
||||
// if(HAL_I2C_Master_Transmit(&baroI2C_handle,i,cobuf, 1,1000) == HAL_OK)
|
||||
// {
|
||||
// uint32_t testValue = ((uint8_t)((i) & (~0x00000001U)));
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
//
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
|
||||
|
||||
HAL_Delay(3000);
|
||||
|
||||
for (int coef_num = 0; coef_num < 8; coef_num++)
|
||||
{
|
||||
HAL_Delay(50);
|
||||
cobuf[0] = 0;
|
||||
cobuf[1] = 0;
|
||||
cobuf[2] = 0;
|
||||
cobuf[0] = CMD_PROM_RD + (coef_num * 2);
|
||||
HAL_I2C_Master_Transmit(&baroI2C_handle, TempaddressW, cobuf, 1, 1000); // send PROM READ command
|
||||
cobuf[0] = 0;
|
||||
HAL_I2C_Master_Receive(&baroI2C_handle, TempaddressR, cobuf, 2, 1000); //Read the adc values
|
||||
uint32_t rC = (cobuf[0] << 8) | cobuf[1];
|
||||
coefficients_arr[coef_num] = rC;
|
||||
}
|
||||
//m_i2c_send(CMD_PROM_RD + coef_num * 2); // send PROM READ command
|
||||
|
||||
|
||||
//
|
||||
// while(true)
|
||||
// {
|
||||
// i++;
|
||||
// //HAL_I2C_Mem_Write()
|
||||
// I2C1->CR1 |= (1 << 8);
|
||||
// HAL_Delay(10);
|
||||
// I2C1->SR1;
|
||||
//
|
||||
// uint32_t Tempaddress = 0b11101100;
|
||||
// I2C1->DR = Tempaddress;
|
||||
// HAL_Delay(10);
|
||||
// uint32_t compVal = (I2C1->SR1 & (1 << 10));
|
||||
// if (compVal != 0)
|
||||
// {
|
||||
// I2C1->SR1 &= ~(1 << 10);
|
||||
// I2C1->CR1 |= (1 << 9);
|
||||
// HAL_Delay(100);
|
||||
//
|
||||
// }
|
||||
// else if (compVal == 0)
|
||||
// {
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
// I2C1->SR2;
|
||||
//
|
||||
// I2C1->DR = CMD_RESET;
|
||||
|
||||
//I2C1->CR1 |= (1 << 9);
|
||||
|
||||
|
||||
HAL_Delay(1000);
|
||||
|
||||
if(HAL_I2C_IsDeviceReady(&baroI2C_handle, ADDRESS_BARO, 10,1000) == HAL_OK)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// m_i2c_send(CMD_RESET);
|
||||
// m_i2c_send(CMD_RESET);
|
||||
// m_i2c_send(CMD_RESET);
|
||||
|
||||
//wait for the reset sequence
|
||||
HAL_Delay(5);
|
||||
@ -200,22 +524,22 @@ void barometer_CaclulateValues()
|
||||
switch (currentCalculationState)
|
||||
{
|
||||
case CALCSTATE_D2_CALCULATION:
|
||||
i2c_send(&baroI2C_handle, ADDRESS_BARO, CMD_ADC_CONV + (CMD_ADC_D2 + CMD_ADC_4096),1); // send conversion command
|
||||
HAL_I2C_Master_Transmit(&baroI2C_handle, ADDRESS_BARO, CMD_ADC_CONV + (CMD_ADC_D2 + CMD_ADC_4096),1,1000); // send conversion command
|
||||
currentCalculationState = CALCSTATE_D2_READ; //change the state so we will go to D2 read next time function is called
|
||||
break;
|
||||
case CALCSTATE_D2_READ:
|
||||
i2c_send(&baroI2C_handle, ADDRESS_BARO, CMD_ADC_READ, 1); //Tell the sensor we want to read
|
||||
i2c_receive(&baroI2C_handle, ADDRESS_BARO, cobuf, 3); //Read the adc values
|
||||
HAL_I2C_Master_Transmit(&baroI2C_handle, ADDRESS_BARO, CMD_ADC_READ, 1, 1000); //Tell the sensor we want to read
|
||||
HAL_I2C_Master_Receive(&baroI2C_handle, ADDRESS_BARO, cobuf, 3, 1000); //Read the adc values
|
||||
D2 = (cobuf[0] << 16) + (cobuf[1] << 8) + cobuf[2]; //Shift the values to the correct position for the 24 bit D2 value
|
||||
currentCalculationState = CALCSTATE_D1_CALCULATION;
|
||||
break;
|
||||
case CALCSTATE_D1_CALCULATION:
|
||||
i2c_send(&baroI2C_handle, ADDRESS_BARO, CMD_ADC_CONV + (CMD_ADC_D1 + CMD_ADC_4096),1); // send conversion command
|
||||
HAL_I2C_Master_Transmit(&baroI2C_handle, ADDRESS_BARO, CMD_ADC_CONV + (CMD_ADC_D1 + CMD_ADC_4096),1, 1000); // send conversion command
|
||||
currentCalculationState = CALCSTATE_D1_READ; //change the state so we will go to D1 read next time function is called
|
||||
break;
|
||||
case CALCSTATE_D1_READ:
|
||||
i2c_send(&baroI2C_handle, ADDRESS_BARO, CMD_ADC_READ, 1); //Tell the sensor we want to read
|
||||
i2c_receive(&baroI2C_handle, ADDRESS_BARO, cobuf, 3); //Read the adc values
|
||||
HAL_I2C_Master_Transmit(&baroI2C_handle, ADDRESS_BARO, CMD_ADC_READ, 1, 1000); //Tell the sensor we want to read
|
||||
HAL_I2C_Master_Receive(&baroI2C_handle, ADDRESS_BARO, cobuf, 3, 1000); //Read the adc values
|
||||
D1 = (cobuf[0] << 16) + (cobuf[1] << 8) + cobuf[2]; //Shift the values to the correct position for the 24 bit D2 value
|
||||
currentCalculationState = CALCSTATE_CALCULATE_PTA;
|
||||
break;
|
||||
|
@ -187,7 +187,7 @@ void systemTaskBaro(void)
|
||||
|
||||
|
||||
|
||||
// //read the barometer
|
||||
//read the barometer
|
||||
// I2C_HandleTypeDef i2c_profile;
|
||||
//
|
||||
// //---- COMPAS WORKING ----
|
||||
@ -211,7 +211,7 @@ void systemTaskBaro(void)
|
||||
//
|
||||
// while (1)
|
||||
// {
|
||||
// i2c_send(&i2c_profile, 0x3D, request_data, 1);
|
||||
// i2c_send(&i2c_profile, address, request_data, 1);
|
||||
// i2c_receive(&i2c_profile, address, response_data, 6);
|
||||
// i2c_send(&i2c_profile, address, reset_pointer_data, 1);
|
||||
//
|
||||
@ -225,17 +225,17 @@ void systemTaskBaro(void)
|
||||
// int16_t y = (~(*(int16_t*)(response_data+4)))+1;
|
||||
// int stop = 5 *2;
|
||||
// }
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user