May 2021 Commit
Dependencies: sx128x sx12xx_hal
main.cpp@7:ccb3088ce5be, 2018-07-18 (annotated)
- Committer:
- Wayne Roberts
- Date:
- Wed Jul 18 18:52:35 2018 -0700
- Revision:
- 7:ccb3088ce5be
- Parent:
- 6:59ba1113b3c6
- Child:
- 8:efd5ceb87878
use sx12xx_hal
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Wayne Roberts |
7:ccb3088ce5be | 1 | //#include "user_platform.h" |
Wayne Roberts |
7:ccb3088ce5be | 2 | #include "radio.h" |
Wayne Roberts |
7:ccb3088ce5be | 3 | |
Wayne Roberts |
7:ccb3088ce5be | 4 | #if defined(SX127x_H) || defined(SX126x_H) |
Wayne Roberts |
7:ccb3088ce5be | 5 | #define BW_KHZ 500 |
Wayne Roberts |
7:ccb3088ce5be | 6 | #define SPREADING_FACTOR 11 |
Wayne Roberts |
7:ccb3088ce5be | 7 | #define CF_HZ 910800000 |
Wayne Roberts |
7:ccb3088ce5be | 8 | #if defined(SX126x_H) |
Wayne Roberts |
7:ccb3088ce5be | 9 | #define TX_DBM (Radio::chipType == CHIP_TYPE_SX1262 ? 20 : 14) |
Wayne Roberts |
7:ccb3088ce5be | 10 | #else |
Wayne Roberts |
7:ccb3088ce5be | 11 | #define TX_DBM 17 |
Wayne Roberts |
7:ccb3088ce5be | 12 | #endif |
Wayne Roberts |
7:ccb3088ce5be | 13 | #elif defined(SX128x_H) |
Wayne Roberts |
7:ccb3088ce5be | 14 | #define BW_KHZ 200 |
Wayne Roberts |
7:ccb3088ce5be | 15 | #define SPREADING_FACTOR 11 |
Wayne Roberts |
7:ccb3088ce5be | 16 | #define CF_HZ 2487000000 |
Wayne Roberts |
7:ccb3088ce5be | 17 | |
Wayne Roberts |
7:ccb3088ce5be | 18 | #define TX_DBM 5 |
Wayne Roberts |
7:ccb3088ce5be | 19 | #endif |
Wayne Roberts |
7:ccb3088ce5be | 20 | |
Wayne Roberts |
7:ccb3088ce5be | 21 | #ifdef TARGET_DISCO_L072CZ_LRWAN1 |
Wayne Roberts |
7:ccb3088ce5be | 22 | DigitalIn pinA(PB_12); |
Wayne Roberts |
7:ccb3088ce5be | 23 | DigitalIn pinB(PB_13); |
Wayne Roberts |
7:ccb3088ce5be | 24 | DigitalIn pinC(PB_14); |
Wayne Roberts |
7:ccb3088ce5be | 25 | DigitalIn pinD(PB_15); |
Wayne Roberts |
7:ccb3088ce5be | 26 | #elif defined(TARGET_FF_MORPHO) |
Wayne Roberts |
7:ccb3088ce5be | 27 | DigitalIn pinA(PC_3); |
Wayne Roberts |
7:ccb3088ce5be | 28 | DigitalIn pinB(PC_2); |
Wayne Roberts |
7:ccb3088ce5be | 29 | DigitalIn pinC(PC_6); |
Wayne Roberts |
7:ccb3088ce5be | 30 | DigitalIn pinD(PC_8); |
Wayne Roberts |
7:ccb3088ce5be | 31 | #endif |
Wayne Roberts |
7:ccb3088ce5be | 32 | |
Wayne Roberts |
7:ccb3088ce5be | 33 | volatile struct _f_ { |
Wayne Roberts |
7:ccb3088ce5be | 34 | uint8_t enable_pin_A : 1; |
Wayne Roberts |
7:ccb3088ce5be | 35 | uint8_t enable_pin_B : 1; |
Wayne Roberts |
7:ccb3088ce5be | 36 | uint8_t enable_pin_C : 1; |
Wayne Roberts |
7:ccb3088ce5be | 37 | uint8_t enable_pin_D : 1; |
Wayne Roberts |
7:ccb3088ce5be | 38 | } flags; |
dudmuck | 0:cb38da4f4b04 | 39 | |
dudmuck | 0:cb38da4f4b04 | 40 | Timer t; |
dudmuck | 3:d8b57eca8c45 | 41 | #define CMD_PINA 0x02 |
dudmuck | 3:d8b57eca8c45 | 42 | #define CMD_PINB 0x03 |
dudmuck | 3:d8b57eca8c45 | 43 | #define CMD_PINC 0x06 |
dudmuck | 3:d8b57eca8c45 | 44 | #define CMD_PIND 0x08 |
dudmuck | 0:cb38da4f4b04 | 45 | |
Wayne Roberts |
7:ccb3088ce5be | 46 | volatile bool tx_done; |
Wayne Roberts |
7:ccb3088ce5be | 47 | |
dudmuck | 0:cb38da4f4b04 | 48 | static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length ) |
dudmuck | 0:cb38da4f4b04 | 49 | { |
dudmuck | 0:cb38da4f4b04 | 50 | // The CRC calculation follows CCITT |
dudmuck | 0:cb38da4f4b04 | 51 | const uint16_t polynom = 0x1021; |
dudmuck | 0:cb38da4f4b04 | 52 | // CRC initial value |
dudmuck | 0:cb38da4f4b04 | 53 | uint16_t crc = 0x0000; |
dudmuck | 0:cb38da4f4b04 | 54 | |
dudmuck | 0:cb38da4f4b04 | 55 | if( buffer == NULL ) |
dudmuck | 0:cb38da4f4b04 | 56 | { |
dudmuck | 0:cb38da4f4b04 | 57 | return 0; |
dudmuck | 0:cb38da4f4b04 | 58 | } |
dudmuck | 0:cb38da4f4b04 | 59 | |
dudmuck | 0:cb38da4f4b04 | 60 | for( uint16_t i = 0; i < length; ++i ) |
dudmuck | 0:cb38da4f4b04 | 61 | { |
dudmuck | 0:cb38da4f4b04 | 62 | crc ^= ( uint16_t ) buffer[i] << 8; |
dudmuck | 0:cb38da4f4b04 | 63 | for( uint16_t j = 0; j < 8; ++j ) |
dudmuck | 0:cb38da4f4b04 | 64 | { |
dudmuck | 0:cb38da4f4b04 | 65 | crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 ); |
dudmuck | 0:cb38da4f4b04 | 66 | } |
dudmuck | 0:cb38da4f4b04 | 67 | } |
dudmuck | 0:cb38da4f4b04 | 68 | |
dudmuck | 0:cb38da4f4b04 | 69 | return crc; |
dudmuck | 0:cb38da4f4b04 | 70 | } |
dudmuck | 0:cb38da4f4b04 | 71 | |
dudmuck | 1:3199506bc2e5 | 72 | void transmit(unsigned target, uint8_t cmd) |
dudmuck | 0:cb38da4f4b04 | 73 | { |
dudmuck | 0:cb38da4f4b04 | 74 | unsigned t_diff; |
dudmuck | 0:cb38da4f4b04 | 75 | uint16_t crc; |
dudmuck | 0:cb38da4f4b04 | 76 | |
Wayne Roberts |
7:ccb3088ce5be | 77 | Radio::radio.tx_buf[0] = cmd; |
dudmuck | 0:cb38da4f4b04 | 78 | t_diff = target - t.read_us(); |
Wayne Roberts |
7:ccb3088ce5be | 79 | Radio::radio.tx_buf[1] = t_diff >> 24; |
Wayne Roberts |
7:ccb3088ce5be | 80 | Radio::radio.tx_buf[2] = t_diff >> 16; |
Wayne Roberts |
7:ccb3088ce5be | 81 | Radio::radio.tx_buf[3] = t_diff >> 8; |
Wayne Roberts |
7:ccb3088ce5be | 82 | Radio::radio.tx_buf[4] = t_diff & 0xff; |
Wayne Roberts |
7:ccb3088ce5be | 83 | crc = crc_ccitt(Radio::radio.tx_buf, 5); |
Wayne Roberts |
7:ccb3088ce5be | 84 | Radio::radio.tx_buf[5] = crc >> 8; |
Wayne Roberts |
7:ccb3088ce5be | 85 | Radio::radio.tx_buf[6] = crc & 0xff; |
dudmuck | 0:cb38da4f4b04 | 86 | |
Wayne Roberts |
7:ccb3088ce5be | 87 | Radio::Send(7, 0, 0, 0); |
dudmuck | 0:cb38da4f4b04 | 88 | |
Wayne Roberts |
7:ccb3088ce5be | 89 | for (tx_done = false; !tx_done; ) |
Wayne Roberts |
7:ccb3088ce5be | 90 | Radio::service(); |
dudmuck | 0:cb38da4f4b04 | 91 | |
dudmuck | 0:cb38da4f4b04 | 92 | printf("t_diff:%u crc:%04x\r\n", t_diff, crc); |
dudmuck | 0:cb38da4f4b04 | 93 | } |
dudmuck | 0:cb38da4f4b04 | 94 | |
dudmuck | 0:cb38da4f4b04 | 95 | #define TARGET_LATENCY 2000000 |
dudmuck | 1:3199506bc2e5 | 96 | void send_alarm(uint8_t cmd) |
dudmuck | 0:cb38da4f4b04 | 97 | { |
dudmuck | 0:cb38da4f4b04 | 98 | int i; |
dudmuck | 0:cb38da4f4b04 | 99 | unsigned target = t.read_us() + TARGET_LATENCY; |
dudmuck | 0:cb38da4f4b04 | 100 | printf("send_alarm() %u\n", target); |
dudmuck | 0:cb38da4f4b04 | 101 | |
dudmuck | 1:3199506bc2e5 | 102 | for (i = 0; i < 5; i++) { |
dudmuck | 1:3199506bc2e5 | 103 | transmit(target, cmd); |
dudmuck | 0:cb38da4f4b04 | 104 | wait(0.1); |
dudmuck | 0:cb38da4f4b04 | 105 | } |
dudmuck | 0:cb38da4f4b04 | 106 | } |
dudmuck | 1:3199506bc2e5 | 107 | |
dudmuck | 1:3199506bc2e5 | 108 | void debounce(DigitalIn* pin, uint8_t cmd) |
dudmuck | 1:3199506bc2e5 | 109 | { |
dudmuck | 1:3199506bc2e5 | 110 | if (!pin->read()) { |
dudmuck | 1:3199506bc2e5 | 111 | int i; |
dudmuck | 1:3199506bc2e5 | 112 | for (i = 0; i < 5; i++) { |
dudmuck | 1:3199506bc2e5 | 113 | wait(0.01); |
dudmuck | 1:3199506bc2e5 | 114 | if (pin->read()) { |
dudmuck | 1:3199506bc2e5 | 115 | printf("trans\r\n"); |
dudmuck | 1:3199506bc2e5 | 116 | break; |
dudmuck | 1:3199506bc2e5 | 117 | } |
dudmuck | 1:3199506bc2e5 | 118 | } |
dudmuck | 1:3199506bc2e5 | 119 | if (i == 5) |
dudmuck | 1:3199506bc2e5 | 120 | send_alarm(cmd); |
dudmuck | 1:3199506bc2e5 | 121 | |
dudmuck | 1:3199506bc2e5 | 122 | while (!pin->read()) |
dudmuck | 1:3199506bc2e5 | 123 | ; |
dudmuck | 1:3199506bc2e5 | 124 | } |
dudmuck | 1:3199506bc2e5 | 125 | } |
dudmuck | 2:0b7620bda2c9 | 126 | |
Wayne Roberts |
7:ccb3088ce5be | 127 | void txDoneCB() |
Wayne Roberts |
7:ccb3088ce5be | 128 | { |
Wayne Roberts |
7:ccb3088ce5be | 129 | tx_done = true; |
Wayne Roberts |
7:ccb3088ce5be | 130 | } |
Wayne Roberts |
7:ccb3088ce5be | 131 | |
Wayne Roberts |
7:ccb3088ce5be | 132 | void rxDoneCB(uint8_t size, float Rssi, float Snr) |
dudmuck | 4:19056d9707ef | 133 | { |
dudmuck | 4:19056d9707ef | 134 | } |
dudmuck | 4:19056d9707ef | 135 | |
Wayne Roberts |
7:ccb3088ce5be | 136 | const RadioEvents_t rev = { |
Wayne Roberts |
7:ccb3088ce5be | 137 | /* Dio0_top_half */ NULL, |
Wayne Roberts |
7:ccb3088ce5be | 138 | /* TxDone_topHalf */ NULL, |
Wayne Roberts |
7:ccb3088ce5be | 139 | /* TxDone_botHalf */ txDoneCB, |
Wayne Roberts |
7:ccb3088ce5be | 140 | /* TxTimeout */ NULL, |
Wayne Roberts |
7:ccb3088ce5be | 141 | /* RxDone */ rxDoneCB, |
Wayne Roberts |
7:ccb3088ce5be | 142 | /* RxTimeout */ NULL, |
Wayne Roberts |
7:ccb3088ce5be | 143 | /* RxError */ NULL, |
Wayne Roberts |
7:ccb3088ce5be | 144 | /* FhssChangeChannel */NULL, |
Wayne Roberts |
7:ccb3088ce5be | 145 | /* CadDone */ NULL |
Wayne Roberts |
7:ccb3088ce5be | 146 | }; |
Wayne Roberts |
7:ccb3088ce5be | 147 | |
dudmuck | 0:cb38da4f4b04 | 148 | int main() |
dudmuck | 0:cb38da4f4b04 | 149 | { |
dudmuck | 0:cb38da4f4b04 | 150 | printf("\r\nreset-tx\r\n"); |
dudmuck | 1:3199506bc2e5 | 151 | |
dudmuck | 3:d8b57eca8c45 | 152 | pinA.mode(PullUp); |
dudmuck | 3:d8b57eca8c45 | 153 | pinB.mode(PullUp); |
dudmuck | 3:d8b57eca8c45 | 154 | pinC.mode(PullUp); |
dudmuck | 3:d8b57eca8c45 | 155 | pinD.mode(PullUp); |
dudmuck | 1:3199506bc2e5 | 156 | |
Wayne Roberts |
7:ccb3088ce5be | 157 | wait(0.05); |
Wayne Roberts |
7:ccb3088ce5be | 158 | |
Wayne Roberts |
7:ccb3088ce5be | 159 | if (pinA.read() == 0) { |
Wayne Roberts |
7:ccb3088ce5be | 160 | printf("pinA-disabled\r\n"); |
Wayne Roberts |
7:ccb3088ce5be | 161 | flags.enable_pin_A = 0; |
Wayne Roberts |
7:ccb3088ce5be | 162 | } else |
Wayne Roberts |
7:ccb3088ce5be | 163 | flags.enable_pin_A = 1; |
Wayne Roberts |
7:ccb3088ce5be | 164 | |
Wayne Roberts |
7:ccb3088ce5be | 165 | if (pinB.read() == 0) { |
Wayne Roberts |
7:ccb3088ce5be | 166 | printf("pinB-disabled\r\n"); |
Wayne Roberts |
7:ccb3088ce5be | 167 | flags.enable_pin_B = 0; |
Wayne Roberts |
7:ccb3088ce5be | 168 | } else |
Wayne Roberts |
7:ccb3088ce5be | 169 | flags.enable_pin_B = 1; |
Wayne Roberts |
7:ccb3088ce5be | 170 | |
Wayne Roberts |
7:ccb3088ce5be | 171 | if (pinC.read() == 0) { |
Wayne Roberts |
7:ccb3088ce5be | 172 | printf("pinC-disabled\r\n"); |
Wayne Roberts |
7:ccb3088ce5be | 173 | flags.enable_pin_C = 0; |
Wayne Roberts |
7:ccb3088ce5be | 174 | } else |
Wayne Roberts |
7:ccb3088ce5be | 175 | flags.enable_pin_C = 1; |
Wayne Roberts |
7:ccb3088ce5be | 176 | |
Wayne Roberts |
7:ccb3088ce5be | 177 | if (pinD.read() == 0) { |
Wayne Roberts |
7:ccb3088ce5be | 178 | printf("pinD-disabled\r\n"); |
Wayne Roberts |
7:ccb3088ce5be | 179 | flags.enable_pin_D = 0; |
Wayne Roberts |
7:ccb3088ce5be | 180 | } else |
Wayne Roberts |
7:ccb3088ce5be | 181 | flags.enable_pin_D = 1; |
Wayne Roberts |
7:ccb3088ce5be | 182 | |
Wayne Roberts |
7:ccb3088ce5be | 183 | t.start(); |
Wayne Roberts |
7:ccb3088ce5be | 184 | |
Wayne Roberts |
7:ccb3088ce5be | 185 | Radio::Init(&rev); |
Wayne Roberts |
7:ccb3088ce5be | 186 | |
Wayne Roberts |
7:ccb3088ce5be | 187 | Radio::Standby(); |
Wayne Roberts |
7:ccb3088ce5be | 188 | Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1); |
Wayne Roberts |
7:ccb3088ce5be | 189 | Radio::LoRaPacketConfig(8, false, true, false); // preambleLen, fixLen, crcOn, invIQ |
Wayne Roberts |
7:ccb3088ce5be | 190 | Radio::SetChannel(CF_HZ); |
Wayne Roberts |
7:ccb3088ce5be | 191 | |
Wayne Roberts |
7:ccb3088ce5be | 192 | Radio::set_tx_dbm(TX_DBM); |
dudmuck | 0:cb38da4f4b04 | 193 | |
dudmuck | 0:cb38da4f4b04 | 194 | for (;;) { |
Wayne Roberts |
7:ccb3088ce5be | 195 | if (flags.enable_pin_A) |
Wayne Roberts |
7:ccb3088ce5be | 196 | debounce(&pinA, CMD_PINA); |
Wayne Roberts |
7:ccb3088ce5be | 197 | |
Wayne Roberts |
7:ccb3088ce5be | 198 | if (flags.enable_pin_B) |
Wayne Roberts |
7:ccb3088ce5be | 199 | debounce(&pinB, CMD_PINB); |
Wayne Roberts |
7:ccb3088ce5be | 200 | |
Wayne Roberts |
7:ccb3088ce5be | 201 | if (flags.enable_pin_C) |
Wayne Roberts |
7:ccb3088ce5be | 202 | debounce(&pinC, CMD_PINC); |
Wayne Roberts |
7:ccb3088ce5be | 203 | |
Wayne Roberts |
7:ccb3088ce5be | 204 | if (flags.enable_pin_D) |
Wayne Roberts |
7:ccb3088ce5be | 205 | debounce(&pinD, CMD_PIND); |
dudmuck | 0:cb38da4f4b04 | 206 | } // ..for (;;) |
dudmuck | 0:cb38da4f4b04 | 207 | } |