V148
Fork of RadioHead-148 by
RHGenericDriver.cpp@0:ab4e012489ef, 2015-10-15 (annotated)
- Committer:
- davidr99
- Date:
- Thu Oct 15 01:27:00 2015 +0000
- Revision:
- 0:ab4e012489ef
Messy start, but a port for RadioHead.; Currently the SPI modulus are the only ones that work.
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 | { |
davidr99 | 0:ab4e012489ef | 47 | if (available()) |
davidr99 | 0:ab4e012489ef | 48 | return true; |
davidr99 | 0:ab4e012489ef | 49 | YIELD; |
davidr99 | 0:ab4e012489ef | 50 | } |
davidr99 | 0:ab4e012489ef | 51 | return false; |
davidr99 | 0:ab4e012489ef | 52 | } |
davidr99 | 0:ab4e012489ef | 53 | |
davidr99 | 0:ab4e012489ef | 54 | bool RHGenericDriver::waitPacketSent() |
davidr99 | 0:ab4e012489ef | 55 | { |
davidr99 | 0:ab4e012489ef | 56 | while (_mode == RHModeTx) |
davidr99 | 0:ab4e012489ef | 57 | YIELD; // Wait for any previous transmit to finish |
davidr99 | 0:ab4e012489ef | 58 | return true; |
davidr99 | 0:ab4e012489ef | 59 | } |
davidr99 | 0:ab4e012489ef | 60 | |
davidr99 | 0:ab4e012489ef | 61 | bool RHGenericDriver::waitPacketSent(uint16_t timeout) |
davidr99 | 0:ab4e012489ef | 62 | { |
davidr99 | 0:ab4e012489ef | 63 | unsigned long starttime = millis(); |
davidr99 | 0:ab4e012489ef | 64 | while ((millis() - starttime) < timeout) |
davidr99 | 0:ab4e012489ef | 65 | { |
davidr99 | 0:ab4e012489ef | 66 | if (_mode != RHModeTx) // Any previous transmit finished? |
davidr99 | 0:ab4e012489ef | 67 | return true; |
davidr99 | 0:ab4e012489ef | 68 | YIELD; |
davidr99 | 0:ab4e012489ef | 69 | } |
davidr99 | 0:ab4e012489ef | 70 | return false; |
davidr99 | 0:ab4e012489ef | 71 | } |
davidr99 | 0:ab4e012489ef | 72 | |
davidr99 | 0:ab4e012489ef | 73 | void RHGenericDriver::setPromiscuous(bool promiscuous) |
davidr99 | 0:ab4e012489ef | 74 | { |
davidr99 | 0:ab4e012489ef | 75 | _promiscuous = promiscuous; |
davidr99 | 0:ab4e012489ef | 76 | } |
davidr99 | 0:ab4e012489ef | 77 | |
davidr99 | 0:ab4e012489ef | 78 | void RHGenericDriver::setThisAddress(uint8_t address) |
davidr99 | 0:ab4e012489ef | 79 | { |
davidr99 | 0:ab4e012489ef | 80 | _thisAddress = address; |
davidr99 | 0:ab4e012489ef | 81 | } |
davidr99 | 0:ab4e012489ef | 82 | |
davidr99 | 0:ab4e012489ef | 83 | void RHGenericDriver::setHeaderTo(uint8_t to) |
davidr99 | 0:ab4e012489ef | 84 | { |
davidr99 | 0:ab4e012489ef | 85 | _txHeaderTo = to; |
davidr99 | 0:ab4e012489ef | 86 | } |
davidr99 | 0:ab4e012489ef | 87 | |
davidr99 | 0:ab4e012489ef | 88 | void RHGenericDriver::setHeaderFrom(uint8_t from) |
davidr99 | 0:ab4e012489ef | 89 | { |
davidr99 | 0:ab4e012489ef | 90 | _txHeaderFrom = from; |
davidr99 | 0:ab4e012489ef | 91 | } |
davidr99 | 0:ab4e012489ef | 92 | |
davidr99 | 0:ab4e012489ef | 93 | void RHGenericDriver::setHeaderId(uint8_t id) |
davidr99 | 0:ab4e012489ef | 94 | { |
davidr99 | 0:ab4e012489ef | 95 | _txHeaderId = id; |
davidr99 | 0:ab4e012489ef | 96 | } |
davidr99 | 0:ab4e012489ef | 97 | |
davidr99 | 0:ab4e012489ef | 98 | void RHGenericDriver::setHeaderFlags(uint8_t set, uint8_t clear) |
davidr99 | 0:ab4e012489ef | 99 | { |
davidr99 | 0:ab4e012489ef | 100 | _txHeaderFlags &= ~clear; |
davidr99 | 0:ab4e012489ef | 101 | _txHeaderFlags |= set; |
davidr99 | 0:ab4e012489ef | 102 | } |
davidr99 | 0:ab4e012489ef | 103 | |
davidr99 | 0:ab4e012489ef | 104 | uint8_t RHGenericDriver::headerTo() |
davidr99 | 0:ab4e012489ef | 105 | { |
davidr99 | 0:ab4e012489ef | 106 | return _rxHeaderTo; |
davidr99 | 0:ab4e012489ef | 107 | } |
davidr99 | 0:ab4e012489ef | 108 | |
davidr99 | 0:ab4e012489ef | 109 | uint8_t RHGenericDriver::headerFrom() |
davidr99 | 0:ab4e012489ef | 110 | { |
davidr99 | 0:ab4e012489ef | 111 | return _rxHeaderFrom; |
davidr99 | 0:ab4e012489ef | 112 | } |
davidr99 | 0:ab4e012489ef | 113 | |
davidr99 | 0:ab4e012489ef | 114 | uint8_t RHGenericDriver::headerId() |
davidr99 | 0:ab4e012489ef | 115 | { |
davidr99 | 0:ab4e012489ef | 116 | return _rxHeaderId; |
davidr99 | 0:ab4e012489ef | 117 | } |
davidr99 | 0:ab4e012489ef | 118 | |
davidr99 | 0:ab4e012489ef | 119 | uint8_t RHGenericDriver::headerFlags() |
davidr99 | 0:ab4e012489ef | 120 | { |
davidr99 | 0:ab4e012489ef | 121 | return _rxHeaderFlags; |
davidr99 | 0:ab4e012489ef | 122 | } |
davidr99 | 0:ab4e012489ef | 123 | |
davidr99 | 0:ab4e012489ef | 124 | int8_t RHGenericDriver::lastRssi() |
davidr99 | 0:ab4e012489ef | 125 | { |
davidr99 | 0:ab4e012489ef | 126 | return _lastRssi; |
davidr99 | 0:ab4e012489ef | 127 | } |
davidr99 | 0:ab4e012489ef | 128 | |
davidr99 | 0:ab4e012489ef | 129 | RHGenericDriver::RHMode RHGenericDriver::mode() |
davidr99 | 0:ab4e012489ef | 130 | { |
davidr99 | 0:ab4e012489ef | 131 | return _mode; |
davidr99 | 0:ab4e012489ef | 132 | } |
davidr99 | 0:ab4e012489ef | 133 | |
davidr99 | 0:ab4e012489ef | 134 | void RHGenericDriver::setMode(RHMode mode) |
davidr99 | 0:ab4e012489ef | 135 | { |
davidr99 | 0:ab4e012489ef | 136 | _mode = mode; |
davidr99 | 0:ab4e012489ef | 137 | } |
davidr99 | 0:ab4e012489ef | 138 | |
davidr99 | 0:ab4e012489ef | 139 | bool RHGenericDriver::sleep() |
davidr99 | 0:ab4e012489ef | 140 | { |
davidr99 | 0:ab4e012489ef | 141 | return false; |
davidr99 | 0:ab4e012489ef | 142 | } |
davidr99 | 0:ab4e012489ef | 143 | |
davidr99 | 0:ab4e012489ef | 144 | // Diagnostic help |
davidr99 | 0:ab4e012489ef | 145 | void RHGenericDriver::printBuffer(const char* prompt, const uint8_t* buf, uint8_t len) |
davidr99 | 0:ab4e012489ef | 146 | { |
davidr99 | 0:ab4e012489ef | 147 | uint8_t i; |
davidr99 | 0:ab4e012489ef | 148 | |
davidr99 | 0:ab4e012489ef | 149 | #ifdef RH_HAVE_SERIAL |
davidr99 | 0:ab4e012489ef | 150 | Serial.println(prompt); |
davidr99 | 0:ab4e012489ef | 151 | for (i = 0; i < len; i++) |
davidr99 | 0:ab4e012489ef | 152 | { |
davidr99 | 0:ab4e012489ef | 153 | if (i % 16 == 15) |
davidr99 | 0:ab4e012489ef | 154 | Serial.println(buf[i], HEX); |
davidr99 | 0:ab4e012489ef | 155 | else |
davidr99 | 0:ab4e012489ef | 156 | { |
davidr99 | 0:ab4e012489ef | 157 | Serial.print(buf[i], HEX); |
davidr99 | 0:ab4e012489ef | 158 | Serial.print(' '); |
davidr99 | 0:ab4e012489ef | 159 | } |
davidr99 | 0:ab4e012489ef | 160 | } |
davidr99 | 0:ab4e012489ef | 161 | Serial.println(""); |
davidr99 | 0:ab4e012489ef | 162 | #endif |
davidr99 | 0:ab4e012489ef | 163 | } |
davidr99 | 0:ab4e012489ef | 164 | |
davidr99 | 0:ab4e012489ef | 165 | uint16_t RHGenericDriver::rxBad() |
davidr99 | 0:ab4e012489ef | 166 | { |
davidr99 | 0:ab4e012489ef | 167 | return _rxBad; |
davidr99 | 0:ab4e012489ef | 168 | } |
davidr99 | 0:ab4e012489ef | 169 | |
davidr99 | 0:ab4e012489ef | 170 | uint16_t RHGenericDriver::rxGood() |
davidr99 | 0:ab4e012489ef | 171 | { |
davidr99 | 0:ab4e012489ef | 172 | return _rxGood; |
davidr99 | 0:ab4e012489ef | 173 | } |
davidr99 | 0:ab4e012489ef | 174 | |
davidr99 | 0:ab4e012489ef | 175 | uint16_t RHGenericDriver::txGood() |
davidr99 | 0:ab4e012489ef | 176 | { |
davidr99 | 0:ab4e012489ef | 177 | return _txGood; |
davidr99 | 0:ab4e012489ef | 178 | } |
davidr99 | 0:ab4e012489ef | 179 | |
davidr99 | 0:ab4e012489ef | 180 | #if (RH_PLATFORM == RH_PLATFORM_ARDUINO) && defined(RH_PLATFORM_ATTINY) |
davidr99 | 0:ab4e012489ef | 181 | // Tinycore does not have __cxa_pure_virtual, so without this we |
davidr99 | 0:ab4e012489ef | 182 | // get linking complaints from the default code generated for pure virtual functions |
davidr99 | 0:ab4e012489ef | 183 | extern "C" void __cxa_pure_virtual() |
davidr99 | 0:ab4e012489ef | 184 | { |
davidr99 | 0:ab4e012489ef | 185 | while (1); |
davidr99 | 0:ab4e012489ef | 186 | } |
davidr99 | 0:ab4e012489ef | 187 | #endif |