/*
SAMD21        RA-02 (SX1278)
--------------------------------
SPI MOSI  ->  MOSI
SPI MISO  ->  MISO
SPI SCK   ->  SCK
GPIO      ->  NSS (CS)
GPIO      ->  RESET
GPIO INT  ->  DIO0  (RX_DONE / TX_DONE)
*/
#include <SPI.h>

/* Change Area */
#define LORA_CS     10
#define LORA_RST    9
#define LORA_DIO0   2

#define DRONE_ID    0x01
#define GCS_ID      0x10

/* SX1278 Register Map*/
#define REG_FIFO                 0x00
#define REG_OP_MODE              0x01
#define REG_FRF_MSB              0x06
#define REG_FRF_MID              0x07
#define REG_FRF_LSB              0x08
#define REG_PA_CONFIG            0x09
#define REG_LNA                  0x0C
#define REG_FIFO_ADDR_PTR        0x0D
#define REG_FIFO_TX_BASE_ADDR    0x0E
#define REG_FIFO_RX_BASE_ADDR    0x0F
#define REG_FIFO_RX_CURRENT_ADDR 0x10
#define REG_IRQ_FLAGS            0x12
#define REG_RX_NB_BYTES          0x13
#define REG_PKT_SNR_VALUE        0x19
#define REG_PKT_RSSI_VALUE       0x1A
#define REG_MODEM_CONFIG_1       0x1D
#define REG_MODEM_CONFIG_2       0x1E
#define REG_PREAMBLE_MSB         0x20
#define REG_PREAMBLE_LSB         0x21
#define REG_PAYLOAD_LENGTH       0x22
#define REG_MODEM_CONFIG_3       0x26
#define REG_DIO_MAPPING_1        0x40
#define REG_VERSION              0x42

/*SX1278 Modes*/
#define MODE_LONG_RANGE_MODE     0x80
#define MODE_SLEEP               0x00
#define MODE_STDBY               0x01
#define MODE_TX                  0x03
#define MODE_RX_CONTINUOUS       0x05

/* Buffer */
#define RX_BUF_LEN  32
#define TX_BUF_LEN  32

volatile uint8_t rxBuffer[RX_BUF_LEN];
volatile uint8_t txBuffer[TX_BUF_LEN];

volatile bool loraRxDone = false;
volatile bool loraTxDone = false;
volatile bool rxPacketReady = false;
volatile uint32_t lastRxTime = 0;

SPISettings loraSPI(8000000, MSBFIRST, SPI_MODE0);

void setup()
{
  loraInit();
  attachInterrupt(digitalPinToInterrupt(LORA_DIO0), onDio0, RISING);
}

void loop()
{
  if (loraRxDone) {
    loraRxDone = false;
    loraReceive();
  }

  if (loraTxDone) {
    loraTxDone = false;
    loraWrite(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_CONTINUOUS);
  }

  if (millis() - lastRxTime > 120) {
    // DISARM / FAILSAFE ACTION
  }

}


