Tactiliest/Tactility/Source/hal/radio/RadioDevice.cpp

100 lines
2.8 KiB
C++

#include "Tactility/hal/radio/RadioDevice.h"
#include <cstring>
namespace tt::hal::radio {
constexpr const char* TAG = "RadioDevice";
bool RadioDevice::setModulation(const RadioDevice::Modulation newModulation) {
// A bool is chosen over an enum class because:
// - this is not tied to user input and
// - the programmer can infer why it didn't work using
// other methods such as getState() and canTransmit/Receive()
const auto state = getState();
if ((state == State::PendingOn) || (state == State::On)) {
return false;
} else if (!((newModulation == Modulation::None) || canTransmit(newModulation) || canReceive(newModulation))) {
return false;
} else {
auto lock = mutex.asScopedLock();
lock.lock();
modulation = newModulation;
}
return true;
}
RadioDevice::Modulation RadioDevice::getModulation() const {
auto lock = mutex.asScopedLock();
lock.lock();
return modulation;
}
RadioDevice::State RadioDevice::getState() const {
auto lock = mutex.asScopedLock();
lock.lock();
return state; // Make copy because of thread safety
}
void RadioDevice::setState(State newState) {
auto lock = mutex.asScopedLock();
lock.lock();
state = newState;
}
void RadioDevice::publishRx(const RxPacket& packet) {
mutex.lock();
for (auto& subscription : rxSubscriptions) {
(*subscription.onData)(getId(), packet);
}
mutex.unlock();
}
const char* toString(RadioDevice::Modulation modulation) {
using enum RadioDevice::Modulation;
switch (modulation) {
case None:
return "none";
case Fsk:
return "FSK";
case LoRa:
return "LoRa";
case LrFhss:
return "LR-FHSS";
default:
return "Unkown";
}
}
const char* toString(RadioDevice::Parameter parameter) {
using enum RadioDevice::Parameter;
switch (parameter) {
case Power:
return TT_STRINGIFY(Power);
case Frequency:
return TT_STRINGIFY(Frequency);
case Bandwidth:
return TT_STRINGIFY(Bandwidth);
case SpreadFactor:
return TT_STRINGIFY(SpreadFactor);
case CodingRate:
return TT_STRINGIFY(CodingRate);
case SyncWord:
return TT_STRINGIFY(SyncWord);
case PreambleLength:
return TT_STRINGIFY(PreambleLength);
case FrequencyDeviation:
return TT_STRINGIFY(FrequencyDeviation);
case DataRate:
return TT_STRINGIFY(DataRate);
case AddressWidth:
return TT_STRINGIFY(AddressWidth);
case NarrowGrid:
return TT_STRINGIFY(NarrowGrid);
default:
return "Unknown";
}
}
} // namespace tt::hal::radio