projet3_temperature/lib/LoRaRadio/LoRaRadio.cpp

106 lines
3.0 KiB
C++

#include "LoRaRadio.h"
lmic_pinmap lmic_pins = {0};
void (*LoRaRadio::downlinkHandler)(u1_t, u1_t, u1_t*) = NULL;
LoRaRadio::LoRaRadio(PinMap pinMap, dr_t dataRate, s1_t txPower) :_pinMap(pinMap), _dataRate(dataRate), _txPower(txPower)
{
lmic_pins.nss = pinMap._nss;
lmic_pins.rxtx = pinMap._rxtx;
lmic_pins.rst = pinMap._rst;
lmic_pins.dio[0] = pinMap._dio[0];
lmic_pins.dio[1] = pinMap._dio[1];
lmic_pins.dio[2] = pinMap._dio[2];
}
void LoRaRadio::init()
{
os_init();
LMIC_reset();
LMIC_setDrTxpow(_dataRate, _txPower);
}
void LoRaRadio::setMCUClockError(u2_t percent)
{
LMIC_setClockError(MAX_CLOCK_ERROR * percent / 100);
}
void LoRaRadio::setTTNSession(u4_t channelId, devaddr_t deviceAddress, xref2u1_t networkSystemKey, xref2u1_t applicationSystemKey, bit_t linkCheckMode)
{
LMIC_setSession(channelId, deviceAddress, networkSystemKey, applicationSystemKey);
LMIC_setLinkCheckMode(linkCheckMode);
}
void LoRaRadio::setRadioEUChannels()
{
LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI); // g-band
LMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(3, 867100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(4, 867300000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(5, 867500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(6, 867700000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(7, 867900000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(8, 868800000, DR_RANGE_MAP(DR_FSK, DR_FSK), BAND_MILLI); // g2-band
LMIC.dn2Dr = DR_SF9;
}
void LoRaRadio::send(u1_t port, uint8_t *data, uint8_t length, u1_t confirmed)
{
if (LMIC.opmode & OP_TXRXPEND)
{
//Serial.println(F("OP_TXRXPEND, not sending"));
}
else
{
// Prepare upstream data transmission at the next possible time.
LMIC_setTxData2(port, data, length, confirmed);
Serial.println("Packet queued");
}
}
void LoRaRadio::run()
{
os_runloop_once();
}
void LoRaRadio::setDownlinkHandler(void (*funcP)(u1_t, u1_t, u1_t*))
{
downlinkHandler = funcP;
}
/*
* Here, we declare the onEvent function required by the LMIC
*/
void onEvent(ev_t ev)
{
switch(ev)
{
case EV_TXCOMPLETE:
//Event telling us that the data was transmitted
//It is also here that we check for downlinks
if(LMIC.dataLen)
{
//Data is available
if(LoRaRadio::downlinkHandler != NULL)
(*LoRaRadio::downlinkHandler)(LMIC.dataLen, LMIC.dataBeg, LMIC.frame);
}
break;
case EV_RXCOMPLETE:
// data received in ping slot
break;
}
}
void LoRaRadio::disableEUChannel(u1_t channel)
{
LMIC_disableChannel(channel);
}
void LoRaRadio::disableAllEUChannelsBut(u1_t channel)
{
for(int i(0); i < 9; i++)
if(i != channel)
LMIC_disableChannel(i);
}