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
RHGenericDriver.cpp@7:250d1c72df36, 2021-06-23 (annotated)
- Committer:
- rlanders73
- Date:
- Wed Jun 23 15:53:12 2021 +0000
- Revision:
- 7:250d1c72df36
- Parent:
- 1:dfeb5e8b199a
explicitly not disabling interrupts for mbed
Who changed what in which revision?
User | Revision | Line number | New 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 |