#include "RadioLibRF95.h"

#define RF95_CHIP_VERSION 0x12
#define RF95_ALT_VERSION 0x11 // Supposedly some versions of the chip have id 0x11

RadioLibRF95::RadioLibRF95(Module *mod) : SX1278(mod) {}

int16_t RadioLibRF95::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint8_t currentLimit,
                            uint16_t preambleLength, uint8_t gain)
{
    // execute common part
    int16_t state = SX127x::begin(RF95_CHIP_VERSION, syncWord, currentLimit, preambleLength);
    if (state != ERR_NONE)
        state = SX127x::begin(RF95_ALT_VERSION, syncWord, currentLimit, preambleLength);
    RADIOLIB_ASSERT(state);

    // configure settings not accessible by API
    state = config();
    RADIOLIB_ASSERT(state);

    // configure publicly accessible settings
    state = setFrequency(freq);
    RADIOLIB_ASSERT(state);

    state = setBandwidth(bw);
    RADIOLIB_ASSERT(state);

    state = setSpreadingFactor(sf);
    RADIOLIB_ASSERT(state);

    state = setCodingRate(cr);
    RADIOLIB_ASSERT(state);

    state = setOutputPower(power);
    RADIOLIB_ASSERT(state);

    state = setGain(gain);

    return (state);
}

int16_t RadioLibRF95::setFrequency(float freq)
{
    // RADIOLIB_CHECK_RANGE(freq, 862.0, 1020.0, ERR_INVALID_FREQUENCY);

    // set frequency
    return (SX127x::setFrequencyRaw(freq));
}

#define RH_RF95_MODEM_STATUS_CLEAR 0x10
#define RH_RF95_MODEM_STATUS_HEADER_INFO_VALID 0x08
#define RH_RF95_MODEM_STATUS_RX_ONGOING 0x04
#define RH_RF95_MODEM_STATUS_SIGNAL_SYNCHRONIZED 0x02
#define RH_RF95_MODEM_STATUS_SIGNAL_DETECTED 0x01

bool RadioLibRF95::isReceiving()
{
    // 0x0b == Look for header info valid, signal synchronized or signal detected
    uint8_t reg = readReg(SX127X_REG_MODEM_STAT);
    // Serial.printf("reg %x\n", reg);
    return (reg & (RH_RF95_MODEM_STATUS_SIGNAL_DETECTED | RH_RF95_MODEM_STATUS_SIGNAL_SYNCHRONIZED |
                   RH_RF95_MODEM_STATUS_HEADER_INFO_VALID)) != 0;
}

uint8_t RadioLibRF95::readReg(uint8_t addr)
{
    return _mod->SPIreadRegister(addr);
}