
#include "BME280.h"

// I2C read 1 byte
uint8_t readRegister(uint8_t reg) {
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(reg);
    Wire.endTransmission();
    Wire.requestFrom(BME280_ADDRESS, 1);
    return Wire.read();
}

// I2C write 1 byte
void writeRegister(uint8_t reg, uint8_t value) {
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(reg);
    Wire.write(value);
    Wire.endTransmission();
}

// Public functions
uint8_t BME280_GetID() {
    return readRegister(BME280_REG_ID);
}

void BME280_Reset() {
    writeRegister(BME280_REG_RESET, BME280_RESET_CMD);
}

uint8_t BME280_CtrlHum() {
    return readRegister(BME280_REG_CTRL_HUM);
}

void BME280_CtrlHum(uint8_t bitpattern) {
    writeRegister(BME280_REG_CTRL_HUM, bitpattern);
}

uint8_t BME280_CtrlMeas() {
    return readRegister(BME280_REG_CTRL_MEAS);
}

void BME280_CtrlMeas(uint8_t bitpattern) {
    writeRegister(BME280_REG_CTRL_MEAS, bitpattern);
}

long BME280_ReadTemperature() {
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(BME280_REG_TEMP_MSB);
    Wire.endTransmission();
    Wire.requestFrom(BME280_ADDRESS, 3);

    long msb = Wire.read();
    long lsb = Wire.read();
    long xlsb = Wire.read();
    long adc_T = ((msb << 16) | (lsb << 8) | xlsb) >> 4;

    return adc_T; // Raw value (compensation needed)
}

int BME280_ReadHumidity() {
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(BME280_REG_HUM_MSB);
    Wire.endTransmission();
    Wire.requestFrom(BME280_ADDRESS, 2);

    int msb = Wire.read();
    int lsb = Wire.read();
    int adc_H = (msb << 8) | lsb;

    return adc_H; // Raw value
}

long BME280_ReadPressure() {
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(BME280_REG_PRESS_MSB);
    Wire.endTransmission();
    Wire.requestFrom(BME280_ADDRESS, 3);

    long msb = Wire.read();
    long lsb = Wire.read();
    long xlsb = Wire.read();
    long adc_P = ((msb << 16) | (lsb << 8) | xlsb) >> 4;

    return adc_P; // Raw value
}