/* ===================== TX / RX ===================== */
void loraSend(uint8_t *data, uint8_t len)
{
  loraWrite(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_STDBY);
  loraWrite(REG_FIFO_ADDR_PTR, 0);
  loraBurstWrite(REG_FIFO, data, len);
  loraWrite(REG_PAYLOAD_LENGTH, len);
  loraWrite(REG_IRQ_FLAGS, 0xFF);
  loraWrite(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_TX);
}

void loraReceive()
{
  uint8_t len = loraRead(REG_RX_NB_BYTES);
  uint8_t addr = loraRead(REG_FIFO_RX_CURRENT_ADDR);
  loraWrite(REG_FIFO_ADDR_PTR, addr);
  loraBurstRead(REG_FIFO, (uint8_t*)rxBuffer, len);
  loraWrite(REG_IRQ_FLAGS, 0xFF);
  rxPacketReady = true;
  lastRxTime = millis();
  loraWrite(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_CONTINUOUS);
}

/* ===================== IRQ ===================== */
void onDio0()
{
  uint8_t irq = loraRead(REG_IRQ_FLAGS);
  if (irq & 0x40) loraRxDone = true;
  if (irq & 0x08) loraTxDone = true;
  loraWrite(REG_IRQ_FLAGS, 0xFF);
}
