point-2-point demo
radio chip selection
Radio chip driver is not included, because these options are available.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
if you're using SX1280, then import sx1280 driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.
TX trigger selection
Edit main.h
to define DIGITAL_TRIGGER
or ANALOG_TRIGGER
to chose whether transmit is initiated by digital pin (button/jumper) or analog pin(s) level change.
This project is intended to be used on two LoRa shields.
Each board sits in continuous RX mode, waiting for request packet.
If the received packet has good CRC, the packet is acknowledged along with read of ADC sample from the replying device.
The original request packet also contains instruction to set level of output pin.
Both sides of the link are running the same code, and each can initiate a transmission at any time.
No addressing is used, so only two nodes can operate on the radio channel.
main.cpp@3:cd312fc32558, 2018-05-30 (annotated)
- Committer:
- Wayne Roberts
- Date:
- Wed May 30 10:20:36 2018 -0700
- Revision:
- 3:cd312fc32558
- Parent:
- 2:5131512b4eb9
- Child:
- 4:b5dd459ac390
add tx trigger on analog input change
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dudmuck | 0:1d8d218c5cc5 | 1 | #include "sx127x_lora.h" |
dudmuck | 1:d95d135a4fb4 | 2 | #include "uart_cmds.h" |
dudmuck | 0:1d8d218c5cc5 | 3 | |
Wayne Roberts |
3:cd312fc32558 | 4 | //#define ANALOG_TX_TRIGGER |
Wayne Roberts |
3:cd312fc32558 | 5 | |
dudmuck | 0:1d8d218c5cc5 | 6 | DigitalOut myled(LED1); |
dudmuck | 0:1d8d218c5cc5 | 7 | |
dudmuck | 0:1d8d218c5cc5 | 8 | SPI spi(D11, D12, D13); // mosi, miso, sclk |
dudmuck | 0:1d8d218c5cc5 | 9 | // dio0, dio1, nss, spi, rst |
dudmuck | 0:1d8d218c5cc5 | 10 | SX127x radio( D2, D3, D10, spi, A0); // sx1276 arduino shield |
dudmuck | 0:1d8d218c5cc5 | 11 | |
dudmuck | 0:1d8d218c5cc5 | 12 | SX127x_lora lora(radio); |
dudmuck | 0:1d8d218c5cc5 | 13 | DigitalInOut rfsw(A4); // for SX1276 arduino shield |
dudmuck | 0:1d8d218c5cc5 | 14 | |
dudmuck | 0:1d8d218c5cc5 | 15 | InterruptIn user_button(USER_BUTTON); |
dudmuck | 0:1d8d218c5cc5 | 16 | Timer t; |
dudmuck | 0:1d8d218c5cc5 | 17 | Ticker ticker; |
dudmuck | 0:1d8d218c5cc5 | 18 | AnalogIn a1(A1); |
Wayne Roberts |
3:cd312fc32558 | 19 | #define AIN_REST_THRESHOLD 96 // 12bit left justified |
dudmuck | 0:1d8d218c5cc5 | 20 | DigitalOut pc6_out(PC_6); |
dudmuck | 0:1d8d218c5cc5 | 21 | |
Wayne Roberts |
3:cd312fc32558 | 22 | #ifndef ANALOG_TX_TRIGGER |
dudmuck | 0:1d8d218c5cc5 | 23 | DigitalOut jumper_out(PC_10); |
dudmuck | 0:1d8d218c5cc5 | 24 | InterruptIn jumper_in(PC_12); |
Wayne Roberts |
3:cd312fc32558 | 25 | volatile bool start_tx; |
Wayne Roberts |
3:cd312fc32558 | 26 | #endif /* !ANALOG_TX_TRIGGER */ |
dudmuck | 0:1d8d218c5cc5 | 27 | |
dudmuck | 0:1d8d218c5cc5 | 28 | void rfsw_callback() |
dudmuck | 0:1d8d218c5cc5 | 29 | { |
dudmuck | 0:1d8d218c5cc5 | 30 | if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) |
dudmuck | 0:1d8d218c5cc5 | 31 | rfsw = 1; |
dudmuck | 0:1d8d218c5cc5 | 32 | else |
dudmuck | 0:1d8d218c5cc5 | 33 | rfsw = 0; |
dudmuck | 0:1d8d218c5cc5 | 34 | } |
dudmuck | 0:1d8d218c5cc5 | 35 | |
dudmuck | 0:1d8d218c5cc5 | 36 | /**********************************************************************/ |
dudmuck | 0:1d8d218c5cc5 | 37 | |
dudmuck | 0:1d8d218c5cc5 | 38 | uint8_t out_pin_state; |
dudmuck | 0:1d8d218c5cc5 | 39 | |
dudmuck | 0:1d8d218c5cc5 | 40 | |
dudmuck | 0:1d8d218c5cc5 | 41 | static uint16_t crc16( uint8_t *buffer, uint16_t length ) |
dudmuck | 0:1d8d218c5cc5 | 42 | { |
dudmuck | 0:1d8d218c5cc5 | 43 | uint16_t i; |
dudmuck | 0:1d8d218c5cc5 | 44 | // The CRC calculation follows CCITT |
dudmuck | 0:1d8d218c5cc5 | 45 | const uint16_t polynom = 0x1021; |
dudmuck | 0:1d8d218c5cc5 | 46 | // CRC initial value |
dudmuck | 0:1d8d218c5cc5 | 47 | uint16_t crc = 0x0000; |
dudmuck | 0:1d8d218c5cc5 | 48 | |
dudmuck | 0:1d8d218c5cc5 | 49 | if( buffer == NULL ) |
dudmuck | 0:1d8d218c5cc5 | 50 | { |
dudmuck | 0:1d8d218c5cc5 | 51 | return 0; |
dudmuck | 0:1d8d218c5cc5 | 52 | } |
dudmuck | 0:1d8d218c5cc5 | 53 | |
dudmuck | 0:1d8d218c5cc5 | 54 | for( i = 0; i < length; ++i ) |
dudmuck | 0:1d8d218c5cc5 | 55 | { |
dudmuck | 0:1d8d218c5cc5 | 56 | uint16_t j; |
dudmuck | 0:1d8d218c5cc5 | 57 | crc ^= ( uint16_t ) buffer[i] << 8; |
dudmuck | 0:1d8d218c5cc5 | 58 | for( j = 0; j < 8; ++j ) |
dudmuck | 0:1d8d218c5cc5 | 59 | { |
dudmuck | 0:1d8d218c5cc5 | 60 | crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 ); |
dudmuck | 0:1d8d218c5cc5 | 61 | } |
dudmuck | 0:1d8d218c5cc5 | 62 | } |
dudmuck | 0:1d8d218c5cc5 | 63 | |
dudmuck | 0:1d8d218c5cc5 | 64 | return crc; |
dudmuck | 0:1d8d218c5cc5 | 65 | } |
dudmuck | 0:1d8d218c5cc5 | 66 | |
dudmuck | 0:1d8d218c5cc5 | 67 | void tx_ack() |
dudmuck | 0:1d8d218c5cc5 | 68 | { |
dudmuck | 0:1d8d218c5cc5 | 69 | uint8_t n = 0; |
dudmuck | 0:1d8d218c5cc5 | 70 | uint16_t crc; |
dudmuck | 0:1d8d218c5cc5 | 71 | |
dudmuck | 0:1d8d218c5cc5 | 72 | if (radio.rx_buf[0] == CMD_OUT_PIN) { |
dudmuck | 0:1d8d218c5cc5 | 73 | uint16_t ain = a1.read_u16(); |
dudmuck | 0:1d8d218c5cc5 | 74 | radio.tx_buf[n++] = CMD_OUT_PIN_ACK; |
dudmuck | 0:1d8d218c5cc5 | 75 | /* TODO read analog pin and digital input pin */ |
dudmuck | 0:1d8d218c5cc5 | 76 | radio.tx_buf[n++] = ain; |
dudmuck | 0:1d8d218c5cc5 | 77 | radio.tx_buf[n++] = ain >> 8; |
dudmuck | 0:1d8d218c5cc5 | 78 | } else |
dudmuck | 0:1d8d218c5cc5 | 79 | radio.tx_buf[n++] = 0xff; |
dudmuck | 0:1d8d218c5cc5 | 80 | |
dudmuck | 0:1d8d218c5cc5 | 81 | crc = crc16(radio.tx_buf, n); |
dudmuck | 0:1d8d218c5cc5 | 82 | radio.tx_buf[n++] = crc; |
dudmuck | 0:1d8d218c5cc5 | 83 | radio.tx_buf[n++] = crc >> 8; |
dudmuck | 0:1d8d218c5cc5 | 84 | |
dudmuck | 0:1d8d218c5cc5 | 85 | lora.RegPayloadLength = n; |
dudmuck | 0:1d8d218c5cc5 | 86 | radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength); |
dudmuck | 0:1d8d218c5cc5 | 87 | |
dudmuck | 0:1d8d218c5cc5 | 88 | lora.start_tx(lora.RegPayloadLength); /* begin transmission */ |
dudmuck | 0:1d8d218c5cc5 | 89 | |
dudmuck | 0:1d8d218c5cc5 | 90 | while (lora.service() != SERVICE_TX_DONE) /* wait for transmission to complete */ |
dudmuck | 0:1d8d218c5cc5 | 91 | ; |
dudmuck | 0:1d8d218c5cc5 | 92 | |
dudmuck | 0:1d8d218c5cc5 | 93 | lora.start_rx(RF_OPMODE_RECEIVER); |
dudmuck | 0:1d8d218c5cc5 | 94 | } |
dudmuck | 0:1d8d218c5cc5 | 95 | |
dudmuck | 1:d95d135a4fb4 | 96 | void radio_tx(uint8_t* payload, uint8_t payload_len) |
dudmuck | 0:1d8d218c5cc5 | 97 | { |
dudmuck | 0:1d8d218c5cc5 | 98 | int i; |
dudmuck | 1:d95d135a4fb4 | 99 | uint8_t n = 0; |
dudmuck | 1:d95d135a4fb4 | 100 | uint16_t crc; |
dudmuck | 1:d95d135a4fb4 | 101 | |
dudmuck | 1:d95d135a4fb4 | 102 | while (payload_len > 0) { |
dudmuck | 1:d95d135a4fb4 | 103 | //printf("n%u, paylen%u\r\n", n, payload_len); |
dudmuck | 1:d95d135a4fb4 | 104 | payload_len--; |
dudmuck | 1:d95d135a4fb4 | 105 | radio.tx_buf[payload_len] = payload[payload_len]; |
dudmuck | 1:d95d135a4fb4 | 106 | n++; |
dudmuck | 1:d95d135a4fb4 | 107 | } |
dudmuck | 1:d95d135a4fb4 | 108 | |
dudmuck | 1:d95d135a4fb4 | 109 | crc = crc16(radio.tx_buf, n); |
dudmuck | 1:d95d135a4fb4 | 110 | radio.tx_buf[n++] = crc; |
dudmuck | 1:d95d135a4fb4 | 111 | radio.tx_buf[n++] = crc >> 8; |
dudmuck | 1:d95d135a4fb4 | 112 | |
dudmuck | 1:d95d135a4fb4 | 113 | lora.RegPayloadLength = n; |
dudmuck | 1:d95d135a4fb4 | 114 | radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength); |
dudmuck | 0:1d8d218c5cc5 | 115 | |
dudmuck | 0:1d8d218c5cc5 | 116 | for (i = 0; i < 3; i++) { |
dudmuck | 0:1d8d218c5cc5 | 117 | int rx_timeout_at; |
dudmuck | 0:1d8d218c5cc5 | 118 | |
dudmuck | 0:1d8d218c5cc5 | 119 | lora.start_tx(lora.RegPayloadLength); /* begin transmission */ |
dudmuck | 0:1d8d218c5cc5 | 120 | |
dudmuck | 0:1d8d218c5cc5 | 121 | while (lora.service() != SERVICE_TX_DONE) /* wait for transmission to complete */ |
dudmuck | 0:1d8d218c5cc5 | 122 | ; |
dudmuck | 0:1d8d218c5cc5 | 123 | rx_timeout_at = t.read_us() + 200000; |
dudmuck | 0:1d8d218c5cc5 | 124 | |
dudmuck | 0:1d8d218c5cc5 | 125 | lora.start_rx(RF_OPMODE_RECEIVER); |
dudmuck | 0:1d8d218c5cc5 | 126 | |
dudmuck | 0:1d8d218c5cc5 | 127 | while (t.read_us() < rx_timeout_at) { |
dudmuck | 0:1d8d218c5cc5 | 128 | if (lora.service() == SERVICE_READ_FIFO) { |
dudmuck | 0:1d8d218c5cc5 | 129 | uint16_t rx_crc; |
dudmuck | 2:5131512b4eb9 | 130 | printf("rssi:%ddBm snr:%.1fdB ", lora.get_pkt_rssi(), lora.RegPktSnrValue / 4.0); |
dudmuck | 0:1d8d218c5cc5 | 131 | rx_crc = radio.rx_buf[lora.RegRxNbBytes-2]; |
dudmuck | 0:1d8d218c5cc5 | 132 | rx_crc |= radio.rx_buf[lora.RegRxNbBytes-1] << 8; |
dudmuck | 0:1d8d218c5cc5 | 133 | crc = crc16(radio.rx_buf, lora.RegRxNbBytes-2); |
dudmuck | 0:1d8d218c5cc5 | 134 | if (crc == rx_crc) { |
dudmuck | 0:1d8d218c5cc5 | 135 | printf("crcOk %u\r\n", i); |
dudmuck | 0:1d8d218c5cc5 | 136 | if (radio.rx_buf[0] == CMD_OUT_PIN_ACK) { |
dudmuck | 2:5131512b4eb9 | 137 | uint16_t ain = radio.rx_buf[1]; |
dudmuck | 2:5131512b4eb9 | 138 | ain |= radio.rx_buf[2] << 8; |
dudmuck | 0:1d8d218c5cc5 | 139 | printf("ain %u\r\n", ain); |
dudmuck | 0:1d8d218c5cc5 | 140 | } |
dudmuck | 0:1d8d218c5cc5 | 141 | return; |
dudmuck | 0:1d8d218c5cc5 | 142 | } else |
dudmuck | 0:1d8d218c5cc5 | 143 | printf("crcFail %04x != %04x\r\n", crc, rx_crc); |
dudmuck | 0:1d8d218c5cc5 | 144 | } |
dudmuck | 0:1d8d218c5cc5 | 145 | } |
dudmuck | 0:1d8d218c5cc5 | 146 | printf("rx-timeout %u\r\n", i); |
dudmuck | 0:1d8d218c5cc5 | 147 | } // ..for() |
dudmuck | 0:1d8d218c5cc5 | 148 | } |
dudmuck | 0:1d8d218c5cc5 | 149 | |
Wayne Roberts |
3:cd312fc32558 | 150 | #ifndef ANALOG_TX_TRIGGER |
dudmuck | 0:1d8d218c5cc5 | 151 | void button_isr() |
dudmuck | 0:1d8d218c5cc5 | 152 | { |
dudmuck | 0:1d8d218c5cc5 | 153 | if (!jumper_in.read()) |
dudmuck | 0:1d8d218c5cc5 | 154 | start_tx = true; |
dudmuck | 0:1d8d218c5cc5 | 155 | } |
dudmuck | 0:1d8d218c5cc5 | 156 | |
dudmuck | 0:1d8d218c5cc5 | 157 | void auto_tx() |
dudmuck | 0:1d8d218c5cc5 | 158 | { |
dudmuck | 0:1d8d218c5cc5 | 159 | if (jumper_in.read()) |
dudmuck | 0:1d8d218c5cc5 | 160 | start_tx = true; |
dudmuck | 0:1d8d218c5cc5 | 161 | else |
dudmuck | 0:1d8d218c5cc5 | 162 | ticker.detach(); |
dudmuck | 0:1d8d218c5cc5 | 163 | } |
Wayne Roberts |
3:cd312fc32558 | 164 | #endif /* !ANALOG_TX_TRIGGER */ |
dudmuck | 0:1d8d218c5cc5 | 165 | |
dudmuck | 0:1d8d218c5cc5 | 166 | int main() |
dudmuck | 0:1d8d218c5cc5 | 167 | { |
Wayne Roberts |
3:cd312fc32558 | 168 | #ifdef ANALOG_TX_TRIGGER |
Wayne Roberts |
3:cd312fc32558 | 169 | uint16_t prev_ain; |
Wayne Roberts |
3:cd312fc32558 | 170 | int8_t ain_movement; |
Wayne Roberts |
3:cd312fc32558 | 171 | bool ain_sent; |
Wayne Roberts |
3:cd312fc32558 | 172 | #else |
dudmuck | 0:1d8d218c5cc5 | 173 | bool jin = false; |
dudmuck | 0:1d8d218c5cc5 | 174 | |
dudmuck | 0:1d8d218c5cc5 | 175 | jumper_out = 1; |
dudmuck | 0:1d8d218c5cc5 | 176 | jumper_in.mode(PullDown); |
dudmuck | 0:1d8d218c5cc5 | 177 | |
dudmuck | 0:1d8d218c5cc5 | 178 | while (!user_button) { |
dudmuck | 0:1d8d218c5cc5 | 179 | printf("button-lo\r\n"); |
dudmuck | 0:1d8d218c5cc5 | 180 | wait(0.01); |
dudmuck | 0:1d8d218c5cc5 | 181 | } |
dudmuck | 0:1d8d218c5cc5 | 182 | user_button.fall(&button_isr); |
Wayne Roberts |
3:cd312fc32558 | 183 | #endif /* !ANALOG_TX_TRIGGER */ |
Wayne Roberts |
3:cd312fc32558 | 184 | printf("\r\n2reset\r\n"); |
dudmuck | 0:1d8d218c5cc5 | 185 | t.start(); |
dudmuck | 0:1d8d218c5cc5 | 186 | |
dudmuck | 0:1d8d218c5cc5 | 187 | radio.rf_switch = rfsw_callback; |
dudmuck | 0:1d8d218c5cc5 | 188 | |
dudmuck | 0:1d8d218c5cc5 | 189 | radio.set_frf_MHz(917.3); |
dudmuck | 0:1d8d218c5cc5 | 190 | lora.enable(); |
dudmuck | 0:1d8d218c5cc5 | 191 | lora.setBw_KHz(500); |
dudmuck | 0:1d8d218c5cc5 | 192 | lora.setSf(9); |
dudmuck | 0:1d8d218c5cc5 | 193 | |
dudmuck | 0:1d8d218c5cc5 | 194 | /* RFO or PABOOST choice: |
dudmuck | 0:1d8d218c5cc5 | 195 | * SX1276 shield: RFO if using 900MHz, or PA_BOOST if using 433MHz |
dudmuck | 0:1d8d218c5cc5 | 196 | */ |
dudmuck | 0:1d8d218c5cc5 | 197 | rfsw.input(); |
dudmuck | 0:1d8d218c5cc5 | 198 | if (rfsw.read()) { |
dudmuck | 0:1d8d218c5cc5 | 199 | printf("LAS\r\n"); |
dudmuck | 0:1d8d218c5cc5 | 200 | /* LAS HF=PA_BOOST LF=RFO */ |
dudmuck | 0:1d8d218c5cc5 | 201 | if (radio.HF) |
dudmuck | 0:1d8d218c5cc5 | 202 | radio.RegPaConfig.bits.PaSelect = 1; |
dudmuck | 0:1d8d218c5cc5 | 203 | else |
dudmuck | 0:1d8d218c5cc5 | 204 | radio.RegPaConfig.bits.PaSelect = 0; |
dudmuck | 0:1d8d218c5cc5 | 205 | } else { |
dudmuck | 0:1d8d218c5cc5 | 206 | /* MAS shield board, only RFO TX */ |
dudmuck | 0:1d8d218c5cc5 | 207 | radio.RegPaConfig.bits.PaSelect = 0; |
dudmuck | 0:1d8d218c5cc5 | 208 | printf("MAS\r\n"); |
dudmuck | 0:1d8d218c5cc5 | 209 | } |
dudmuck | 0:1d8d218c5cc5 | 210 | rfsw.output(); |
dudmuck | 0:1d8d218c5cc5 | 211 | radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet); |
dudmuck | 0:1d8d218c5cc5 | 212 | |
dudmuck | 0:1d8d218c5cc5 | 213 | lora.start_rx(RF_OPMODE_RECEIVER); |
dudmuck | 0:1d8d218c5cc5 | 214 | |
Wayne Roberts |
3:cd312fc32558 | 215 | #ifdef ANALOG_TX_TRIGGER |
Wayne Roberts |
3:cd312fc32558 | 216 | prev_ain = a1.read_u16(); |
Wayne Roberts |
3:cd312fc32558 | 217 | ain_movement = 0; |
Wayne Roberts |
3:cd312fc32558 | 218 | ain_sent = false; |
Wayne Roberts |
3:cd312fc32558 | 219 | #endif /* ANALOG_TX_TRIGGER */ |
dudmuck | 0:1d8d218c5cc5 | 220 | for (;;) { |
Wayne Roberts |
3:cd312fc32558 | 221 | #ifdef ANALOG_TX_TRIGGER |
Wayne Roberts |
3:cd312fc32558 | 222 | uint16_t ain = a1.read_u16(); |
Wayne Roberts |
3:cd312fc32558 | 223 | uint16_t diff = abs(ain-prev_ain); |
Wayne Roberts |
3:cd312fc32558 | 224 | if (diff > AIN_REST_THRESHOLD) { |
Wayne Roberts |
3:cd312fc32558 | 225 | ain_sent = false; |
Wayne Roberts |
3:cd312fc32558 | 226 | if (ain_movement < 1) |
Wayne Roberts |
3:cd312fc32558 | 227 | ain_movement = 1; |
Wayne Roberts |
3:cd312fc32558 | 228 | else { |
Wayne Roberts |
3:cd312fc32558 | 229 | if (++ain_movement > 16) |
Wayne Roberts |
3:cd312fc32558 | 230 | ain_movement = 16; |
Wayne Roberts |
3:cd312fc32558 | 231 | } |
Wayne Roberts |
3:cd312fc32558 | 232 | } else { |
Wayne Roberts |
3:cd312fc32558 | 233 | /* steady state */ |
Wayne Roberts |
3:cd312fc32558 | 234 | if (ain_movement > 0) |
Wayne Roberts |
3:cd312fc32558 | 235 | ain_movement = 0; |
Wayne Roberts |
3:cd312fc32558 | 236 | else { |
Wayne Roberts |
3:cd312fc32558 | 237 | if (--ain_movement < -16) { |
Wayne Roberts |
3:cd312fc32558 | 238 | ain_movement = -16; |
Wayne Roberts |
3:cd312fc32558 | 239 | if (!ain_sent) { |
Wayne Roberts |
3:cd312fc32558 | 240 | uint8_t buf[4]; |
Wayne Roberts |
3:cd312fc32558 | 241 | printf("## %02x ##\r\n", ain >> 8); |
Wayne Roberts |
3:cd312fc32558 | 242 | buf[0] = CMD_PWM; |
Wayne Roberts |
3:cd312fc32558 | 243 | buf[1] = 120; // Hz |
Wayne Roberts |
3:cd312fc32558 | 244 | buf[2] = ain >> 8; // duty |
Wayne Roberts |
3:cd312fc32558 | 245 | radio_tx(buf, 3); |
Wayne Roberts |
3:cd312fc32558 | 246 | ain_sent = true; |
Wayne Roberts |
3:cd312fc32558 | 247 | } |
Wayne Roberts |
3:cd312fc32558 | 248 | } |
Wayne Roberts |
3:cd312fc32558 | 249 | } |
Wayne Roberts |
3:cd312fc32558 | 250 | } |
Wayne Roberts |
3:cd312fc32558 | 251 | //printf("%05u diff:%04u move:%d\r\n", ain, diff, ain_movement); |
Wayne Roberts |
3:cd312fc32558 | 252 | prev_ain = ain; |
Wayne Roberts |
3:cd312fc32558 | 253 | wait_us(5000); |
Wayne Roberts |
3:cd312fc32558 | 254 | |
Wayne Roberts |
3:cd312fc32558 | 255 | #else |
dudmuck | 0:1d8d218c5cc5 | 256 | |
dudmuck | 0:1d8d218c5cc5 | 257 | if (jumper_in.read()) { |
dudmuck | 0:1d8d218c5cc5 | 258 | if (!jin) { |
dudmuck | 0:1d8d218c5cc5 | 259 | ticker.attach(auto_tx, 0.5); |
dudmuck | 0:1d8d218c5cc5 | 260 | jin = true; |
dudmuck | 0:1d8d218c5cc5 | 261 | } |
dudmuck | 0:1d8d218c5cc5 | 262 | } else { |
dudmuck | 0:1d8d218c5cc5 | 263 | jin = false; |
dudmuck | 0:1d8d218c5cc5 | 264 | } |
dudmuck | 0:1d8d218c5cc5 | 265 | |
dudmuck | 0:1d8d218c5cc5 | 266 | if (start_tx) { |
dudmuck | 1:d95d135a4fb4 | 267 | start_tx = false; |
dudmuck | 1:d95d135a4fb4 | 268 | |
dudmuck | 1:d95d135a4fb4 | 269 | uint8_t buf[2]; |
dudmuck | 0:1d8d218c5cc5 | 270 | out_pin_state ^= 1; |
dudmuck | 1:d95d135a4fb4 | 271 | buf[0] = CMD_OUT_PIN; |
dudmuck | 1:d95d135a4fb4 | 272 | buf[1] = out_pin_state; |
dudmuck | 1:d95d135a4fb4 | 273 | printf("start_tx...\r\n"); |
dudmuck | 1:d95d135a4fb4 | 274 | radio_tx(buf, 2); |
dudmuck | 0:1d8d218c5cc5 | 275 | } |
Wayne Roberts |
3:cd312fc32558 | 276 | #endif /* !ANALOG_TX_TRIGGER */ |
dudmuck | 0:1d8d218c5cc5 | 277 | if (lora.service() == SERVICE_READ_FIFO) { |
dudmuck | 0:1d8d218c5cc5 | 278 | uint16_t crc, rx_crc; |
dudmuck | 0:1d8d218c5cc5 | 279 | int i; |
dudmuck | 0:1d8d218c5cc5 | 280 | for (i = 0; i < lora.RegRxNbBytes; i++) { |
dudmuck | 0:1d8d218c5cc5 | 281 | printf("%02x ", radio.rx_buf[i]); |
dudmuck | 0:1d8d218c5cc5 | 282 | } |
dudmuck | 2:5131512b4eb9 | 283 | printf(" rssi:%ddBm, snr:%.1fdB\r\n", lora.get_pkt_rssi(), lora.RegPktSnrValue / 4.0); |
dudmuck | 0:1d8d218c5cc5 | 284 | rx_crc = radio.rx_buf[lora.RegRxNbBytes-2]; |
dudmuck | 0:1d8d218c5cc5 | 285 | rx_crc |= radio.rx_buf[lora.RegRxNbBytes-1] << 8; |
dudmuck | 0:1d8d218c5cc5 | 286 | crc = crc16(radio.rx_buf, lora.RegRxNbBytes-2); |
dudmuck | 0:1d8d218c5cc5 | 287 | if (crc == rx_crc) { |
dudmuck | 0:1d8d218c5cc5 | 288 | printf("crcOk\r\n"); |
dudmuck | 1:d95d135a4fb4 | 289 | if (!parse_radio_rx(radio.rx_buf) && radio.rx_buf[0] == CMD_OUT_PIN) { |
dudmuck | 0:1d8d218c5cc5 | 290 | pc6_out.write(radio.rx_buf[1]); |
dudmuck | 0:1d8d218c5cc5 | 291 | printf("out pin state: %u", radio.rx_buf[1]); |
dudmuck | 0:1d8d218c5cc5 | 292 | } |
dudmuck | 0:1d8d218c5cc5 | 293 | printf("\r\n"); |
dudmuck | 0:1d8d218c5cc5 | 294 | tx_ack(); |
dudmuck | 0:1d8d218c5cc5 | 295 | } else |
dudmuck | 0:1d8d218c5cc5 | 296 | printf("crc %04x != %04x\r\n", crc, rx_crc); |
dudmuck | 0:1d8d218c5cc5 | 297 | } // ..if something received |
dudmuck | 1:d95d135a4fb4 | 298 | |
dudmuck | 1:d95d135a4fb4 | 299 | uart_service(); |
dudmuck | 0:1d8d218c5cc5 | 300 | } // ..for (;;) |
dudmuck | 0:1d8d218c5cc5 | 301 | } |
dudmuck | 0:1d8d218c5cc5 | 302 |