This driver is a stripped down version of the Radiohead 1.45 driver, and covers fewer radios. Threading and an event queue have been added to make the ISR's more stable across architectures. Specifically The STM32L4 parts

Dependents:   Threaded_LoRa_Modem

Committer:
rlanders73
Date:
Fri Apr 30 15:16:24 2021 +0000
Revision:
1:dfeb5e8b199a
Parent:
0:ab4e012489ef
making this work for Geneva;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davidr99 0:ab4e012489ef 1 // RHGenericDriver.cpp
davidr99 0:ab4e012489ef 2 //
davidr99 0:ab4e012489ef 3 // Copyright (C) 2014 Mike McCauley
davidr99 0:ab4e012489ef 4 // $Id: RHGenericDriver.cpp,v 1.18 2015/01/02 21:38:24 mikem Exp $
davidr99 0:ab4e012489ef 5
davidr99 0:ab4e012489ef 6 #include <RHGenericDriver.h>
davidr99 0:ab4e012489ef 7
davidr99 0:ab4e012489ef 8 Timer _millisTimer;
davidr99 0:ab4e012489ef 9
davidr99 0:ab4e012489ef 10 RHGenericDriver::RHGenericDriver()
davidr99 0:ab4e012489ef 11 :
davidr99 0:ab4e012489ef 12 _mode(RHModeInitialising),
davidr99 0:ab4e012489ef 13 _thisAddress(RH_BROADCAST_ADDRESS),
davidr99 0:ab4e012489ef 14 _txHeaderTo(RH_BROADCAST_ADDRESS),
davidr99 0:ab4e012489ef 15 _txHeaderFrom(RH_BROADCAST_ADDRESS),
davidr99 0:ab4e012489ef 16 _txHeaderId(0),
davidr99 0:ab4e012489ef 17 _txHeaderFlags(0),
davidr99 0:ab4e012489ef 18 _rxBad(0),
davidr99 0:ab4e012489ef 19 _rxGood(0),
davidr99 0:ab4e012489ef 20 _txGood(0)
davidr99 0:ab4e012489ef 21 {
davidr99 0:ab4e012489ef 22 #if (RH_PLATFORM == RH_PLATFORM_MBED)
davidr99 0:ab4e012489ef 23 _millisTimer.start();
davidr99 0:ab4e012489ef 24 #endif
davidr99 0:ab4e012489ef 25 }
davidr99 0:ab4e012489ef 26
davidr99 0:ab4e012489ef 27 bool RHGenericDriver::init()
davidr99 0:ab4e012489ef 28 {
davidr99 0:ab4e012489ef 29 return true;
davidr99 0:ab4e012489ef 30 }
davidr99 0:ab4e012489ef 31
davidr99 0:ab4e012489ef 32 // Blocks until a valid message is received
davidr99 0:ab4e012489ef 33 void RHGenericDriver::waitAvailable()
davidr99 0:ab4e012489ef 34 {
davidr99 0:ab4e012489ef 35 while (!available())
davidr99 0:ab4e012489ef 36 YIELD;
davidr99 0:ab4e012489ef 37 }
davidr99 0:ab4e012489ef 38
davidr99 0:ab4e012489ef 39 // Blocks until a valid message is received or timeout expires
davidr99 0:ab4e012489ef 40 // Return true if there is a message available
davidr99 0:ab4e012489ef 41 // Works correctly even on millis() rollover
davidr99 0:ab4e012489ef 42 bool RHGenericDriver::waitAvailableTimeout(uint16_t timeout)
davidr99 0:ab4e012489ef 43 {
davidr99 0:ab4e012489ef 44 unsigned long starttime = millis();
davidr99 0:ab4e012489ef 45 while ((millis() - starttime) < timeout)
davidr99 0:ab4e012489ef 46 {
rlanders73 1:dfeb5e8b199a 47 if (available()){
davidr99 0:ab4e012489ef 48 return true;
rlanders73 1:dfeb5e8b199a 49 }
rlanders73 1:dfeb5e8b199a 50 // ThisThread::sleep_for(1);
davidr99 0:ab4e012489ef 51 YIELD;
davidr99 0:ab4e012489ef 52 }
davidr99 0:ab4e012489ef 53 return false;
davidr99 0:ab4e012489ef 54 }
davidr99 0:ab4e012489ef 55
davidr99 0:ab4e012489ef 56 bool RHGenericDriver::waitPacketSent()
davidr99 0:ab4e012489ef 57 {
rlanders73 1:dfeb5e8b199a 58 while (_mode == RHModeTx){
davidr99 0:ab4e012489ef 59 YIELD; // Wait for any previous transmit to finish
rlanders73 1:dfeb5e8b199a 60 }
davidr99 0:ab4e012489ef 61 return true;
davidr99 0:ab4e012489ef 62 }
davidr99 0:ab4e012489ef 63
davidr99 0:ab4e012489ef 64 bool RHGenericDriver::waitPacketSent(uint16_t timeout)
davidr99 0:ab4e012489ef 65 {
davidr99 0:ab4e012489ef 66 unsigned long starttime = millis();
davidr99 0:ab4e012489ef 67 while ((millis() - starttime) < timeout)
davidr99 0:ab4e012489ef 68 {
davidr99 0:ab4e012489ef 69 if (_mode != RHModeTx) // Any previous transmit finished?
davidr99 0:ab4e012489ef 70 return true;
davidr99 0:ab4e012489ef 71 YIELD;
davidr99 0:ab4e012489ef 72 }
davidr99 0:ab4e012489ef 73 return false;
davidr99 0:ab4e012489ef 74 }
davidr99 0:ab4e012489ef 75
davidr99 0:ab4e012489ef 76 void RHGenericDriver::setPromiscuous(bool promiscuous)
davidr99 0:ab4e012489ef 77 {
davidr99 0:ab4e012489ef 78 _promiscuous = promiscuous;
davidr99 0:ab4e012489ef 79 }
davidr99 0:ab4e012489ef 80
davidr99 0:ab4e012489ef 81 void RHGenericDriver::setThisAddress(uint8_t address)
davidr99 0:ab4e012489ef 82 {
davidr99 0:ab4e012489ef 83 _thisAddress = address;
davidr99 0:ab4e012489ef 84 }
davidr99 0:ab4e012489ef 85
davidr99 0:ab4e012489ef 86 void RHGenericDriver::setHeaderTo(uint8_t to)
davidr99 0:ab4e012489ef 87 {
davidr99 0:ab4e012489ef 88 _txHeaderTo = to;
davidr99 0:ab4e012489ef 89 }
davidr99 0:ab4e012489ef 90
davidr99 0:ab4e012489ef 91 void RHGenericDriver::setHeaderFrom(uint8_t from)
davidr99 0:ab4e012489ef 92 {
davidr99 0:ab4e012489ef 93 _txHeaderFrom = from;
davidr99 0:ab4e012489ef 94 }
davidr99 0:ab4e012489ef 95
davidr99 0:ab4e012489ef 96 void RHGenericDriver::setHeaderId(uint8_t id)
davidr99 0:ab4e012489ef 97 {
davidr99 0:ab4e012489ef 98 _txHeaderId = id;
davidr99 0:ab4e012489ef 99 }
davidr99 0:ab4e012489ef 100
davidr99 0:ab4e012489ef 101 void RHGenericDriver::setHeaderFlags(uint8_t set, uint8_t clear)
davidr99 0:ab4e012489ef 102 {
davidr99 0:ab4e012489ef 103 _txHeaderFlags &= ~clear;
davidr99 0:ab4e012489ef 104 _txHeaderFlags |= set;
davidr99 0:ab4e012489ef 105 }
davidr99 0:ab4e012489ef 106
davidr99 0:ab4e012489ef 107 uint8_t RHGenericDriver::headerTo()
davidr99 0:ab4e012489ef 108 {
davidr99 0:ab4e012489ef 109 return _rxHeaderTo;
davidr99 0:ab4e012489ef 110 }
davidr99 0:ab4e012489ef 111
davidr99 0:ab4e012489ef 112 uint8_t RHGenericDriver::headerFrom()
davidr99 0:ab4e012489ef 113 {
davidr99 0:ab4e012489ef 114 return _rxHeaderFrom;
davidr99 0:ab4e012489ef 115 }
davidr99 0:ab4e012489ef 116
davidr99 0:ab4e012489ef 117 uint8_t RHGenericDriver::headerId()
davidr99 0:ab4e012489ef 118 {
davidr99 0:ab4e012489ef 119 return _rxHeaderId;
davidr99 0:ab4e012489ef 120 }
davidr99 0:ab4e012489ef 121
davidr99 0:ab4e012489ef 122 uint8_t RHGenericDriver::headerFlags()
davidr99 0:ab4e012489ef 123 {
davidr99 0:ab4e012489ef 124 return _rxHeaderFlags;
davidr99 0:ab4e012489ef 125 }
davidr99 0:ab4e012489ef 126
davidr99 0:ab4e012489ef 127 int8_t RHGenericDriver::lastRssi()
davidr99 0:ab4e012489ef 128 {
davidr99 0:ab4e012489ef 129 return _lastRssi;
davidr99 0:ab4e012489ef 130 }
davidr99 0:ab4e012489ef 131
davidr99 0:ab4e012489ef 132 RHGenericDriver::RHMode RHGenericDriver::mode()
davidr99 0:ab4e012489ef 133 {
davidr99 0:ab4e012489ef 134 return _mode;
davidr99 0:ab4e012489ef 135 }
davidr99 0:ab4e012489ef 136
davidr99 0:ab4e012489ef 137 void RHGenericDriver::setMode(RHMode mode)
davidr99 0:ab4e012489ef 138 {
davidr99 0:ab4e012489ef 139 _mode = mode;
davidr99 0:ab4e012489ef 140 }
davidr99 0:ab4e012489ef 141
davidr99 0:ab4e012489ef 142 bool RHGenericDriver::sleep()
davidr99 0:ab4e012489ef 143 {
davidr99 0:ab4e012489ef 144 return false;
davidr99 0:ab4e012489ef 145 }
davidr99 0:ab4e012489ef 146
davidr99 0:ab4e012489ef 147 // Diagnostic help
davidr99 0:ab4e012489ef 148 void RHGenericDriver::printBuffer(const char* prompt, const uint8_t* buf, uint8_t len)
davidr99 0:ab4e012489ef 149 {
davidr99 0:ab4e012489ef 150 uint8_t i;
davidr99 0:ab4e012489ef 151
davidr99 0:ab4e012489ef 152 #ifdef RH_HAVE_SERIAL
davidr99 0:ab4e012489ef 153 Serial.println(prompt);
davidr99 0:ab4e012489ef 154 for (i = 0; i < len; i++)
davidr99 0:ab4e012489ef 155 {
davidr99 0:ab4e012489ef 156 if (i % 16 == 15)
davidr99 0:ab4e012489ef 157 Serial.println(buf[i], HEX);
davidr99 0:ab4e012489ef 158 else
davidr99 0:ab4e012489ef 159 {
davidr99 0:ab4e012489ef 160 Serial.print(buf[i], HEX);
davidr99 0:ab4e012489ef 161 Serial.print(' ');
davidr99 0:ab4e012489ef 162 }
davidr99 0:ab4e012489ef 163 }
davidr99 0:ab4e012489ef 164 Serial.println("");
davidr99 0:ab4e012489ef 165 #endif
davidr99 0:ab4e012489ef 166 }
davidr99 0:ab4e012489ef 167
davidr99 0:ab4e012489ef 168 uint16_t RHGenericDriver::rxBad()
davidr99 0:ab4e012489ef 169 {
davidr99 0:ab4e012489ef 170 return _rxBad;
davidr99 0:ab4e012489ef 171 }
davidr99 0:ab4e012489ef 172
davidr99 0:ab4e012489ef 173 uint16_t RHGenericDriver::rxGood()
davidr99 0:ab4e012489ef 174 {
davidr99 0:ab4e012489ef 175 return _rxGood;
davidr99 0:ab4e012489ef 176 }
davidr99 0:ab4e012489ef 177
davidr99 0:ab4e012489ef 178 uint16_t RHGenericDriver::txGood()
davidr99 0:ab4e012489ef 179 {
davidr99 0:ab4e012489ef 180 return _txGood;
davidr99 0:ab4e012489ef 181 }
davidr99 0:ab4e012489ef 182
davidr99 0:ab4e012489ef 183 #if (RH_PLATFORM == RH_PLATFORM_ARDUINO) && defined(RH_PLATFORM_ATTINY)
davidr99 0:ab4e012489ef 184 // Tinycore does not have __cxa_pure_virtual, so without this we
davidr99 0:ab4e012489ef 185 // get linking complaints from the default code generated for pure virtual functions
davidr99 0:ab4e012489ef 186 extern "C" void __cxa_pure_virtual()
davidr99 0:ab4e012489ef 187 {
davidr99 0:ab4e012489ef 188 while (1);
davidr99 0:ab4e012489ef 189 }
davidr99 0:ab4e012489ef 190 #endif