Terminal for sending and receiving data via Semtech SX1276 chip. It uses the FRDM-KL25Z board, with a Modtronix inAir9 SX1276 board, and Modtronix SHD3I shield. The inAir9 module is mounted in iMod port 3 of the SHD3I module. The SHD3I shield is mounted on the FRDM-KL25Z board.
Dependencies: SX127x_modtronix mbed
Fork of chat_sx127x by
main.cpp@0:be215de91a68, 2014-03-26 (annotated)
- Committer:
- dudmuck
- Date:
- Wed Mar 26 01:13:30 2014 +0000
- Revision:
- 0:be215de91a68
- Child:
- 1:1cd0afbed23c
demo test application for sx127x
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dudmuck | 0:be215de91a68 | 1 | #include "sx127x.h" |
dudmuck | 0:be215de91a68 | 2 | |
dudmuck | 0:be215de91a68 | 3 | /* |
dudmuck | 0:be215de91a68 | 4 | * http://mbed.org/handbook/mbed-FRDM-KL25Z |
dudmuck | 0:be215de91a68 | 5 | */ |
dudmuck | 0:be215de91a68 | 6 | |
dudmuck | 0:be215de91a68 | 7 | DigitalOut green(LED_GREEN); |
dudmuck | 0:be215de91a68 | 8 | |
dudmuck | 0:be215de91a68 | 9 | Serial pc(USBTX, USBRX); |
dudmuck | 0:be215de91a68 | 10 | |
dudmuck | 0:be215de91a68 | 11 | uint8_t tx_cnt; |
dudmuck | 0:be215de91a68 | 12 | char pcbuf[64]; |
dudmuck | 0:be215de91a68 | 13 | |
dudmuck | 0:be215de91a68 | 14 | typedef enum { |
dudmuck | 0:be215de91a68 | 15 | APP_NONE = 0, |
dudmuck | 0:be215de91a68 | 16 | APP_CHAT |
dudmuck | 0:be215de91a68 | 17 | } app_e; |
dudmuck | 0:be215de91a68 | 18 | |
dudmuck | 0:be215de91a68 | 19 | app_e app = APP_NONE; |
dudmuck | 0:be215de91a68 | 20 | |
dudmuck | 0:be215de91a68 | 21 | |
dudmuck | 0:be215de91a68 | 22 | /*const uint32_t my_frf_a = 914.0 / FREQ_STEP_MHZ; |
dudmuck | 0:be215de91a68 | 23 | const uint32_t my_frf_b = 915.0 / FREQ_STEP_MHZ;*/ |
dudmuck | 0:be215de91a68 | 24 | const uint32_t frfs[] = { |
dudmuck | 0:be215de91a68 | 25 | MHZ_TO_FRF(903.0), |
dudmuck | 0:be215de91a68 | 26 | MHZ_TO_FRF(904.0), |
dudmuck | 0:be215de91a68 | 27 | MHZ_TO_FRF(905.0), |
dudmuck | 0:be215de91a68 | 28 | MHZ_TO_FRF(906.0), |
dudmuck | 0:be215de91a68 | 29 | MHZ_TO_FRF(907.0), |
dudmuck | 0:be215de91a68 | 30 | MHZ_TO_FRF(908.0), |
dudmuck | 0:be215de91a68 | 31 | MHZ_TO_FRF(909.0), |
dudmuck | 0:be215de91a68 | 32 | MHZ_TO_FRF(910.0), |
dudmuck | 0:be215de91a68 | 33 | MHZ_TO_FRF(911.0), |
dudmuck | 0:be215de91a68 | 34 | MHZ_TO_FRF(912.0), |
dudmuck | 0:be215de91a68 | 35 | MHZ_TO_FRF(913.0), |
dudmuck | 0:be215de91a68 | 36 | MHZ_TO_FRF(914.0), |
dudmuck | 0:be215de91a68 | 37 | MHZ_TO_FRF(915.0) |
dudmuck | 0:be215de91a68 | 38 | }; |
dudmuck | 0:be215de91a68 | 39 | |
dudmuck | 0:be215de91a68 | 40 | /******************************************************************************/ |
dudmuck | 0:be215de91a68 | 41 | |
dudmuck | 0:be215de91a68 | 42 | // pin: 3 8 1 7 10 12 5 20 18 |
dudmuck | 0:be215de91a68 | 43 | // mosi, miso, sclk, cs, rst, dio0, dio1, fctx, fcps |
dudmuck | 0:be215de91a68 | 44 | SX127x radio(PTD2, PTD3, PTD1, PTD0, PTD5, PTA13, PTD4, PTC9, PTC8); |
dudmuck | 0:be215de91a68 | 45 | |
dudmuck | 0:be215de91a68 | 46 | void printLoraIrqs_(bool clear) |
dudmuck | 0:be215de91a68 | 47 | { |
dudmuck | 0:be215de91a68 | 48 | //in radio class -- RegIrqFlags_t RegIrqFlags; |
dudmuck | 0:be215de91a68 | 49 | |
dudmuck | 0:be215de91a68 | 50 | //already read RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS); |
dudmuck | 0:be215de91a68 | 51 | printf("\r\nIrqFlags:"); |
dudmuck | 0:be215de91a68 | 52 | if (radio.RegIrqFlags.bits.CadDetected) |
dudmuck | 0:be215de91a68 | 53 | printf("CadDetected "); |
dudmuck | 0:be215de91a68 | 54 | if (radio.RegIrqFlags.bits.FhssChangeChannel) { |
dudmuck | 0:be215de91a68 | 55 | //radio.RegHopChannel.octet = radio.read_reg(REG_LR_HOPCHANNEL); |
dudmuck | 0:be215de91a68 | 56 | printf("FhssChangeChannel:%d ", radio.RegHopChannel.bits.FhssPresentChannel); |
dudmuck | 0:be215de91a68 | 57 | } |
dudmuck | 0:be215de91a68 | 58 | if (radio.RegIrqFlags.bits.CadDone) |
dudmuck | 0:be215de91a68 | 59 | printf("CadDone "); |
dudmuck | 0:be215de91a68 | 60 | if (radio.RegIrqFlags.bits.TxDone) |
dudmuck | 0:be215de91a68 | 61 | printf("TxDone "); |
dudmuck | 0:be215de91a68 | 62 | if (radio.RegIrqFlags.bits.ValidHeader) |
dudmuck | 0:be215de91a68 | 63 | printf("[42mValidHeader[0m "); |
dudmuck | 0:be215de91a68 | 64 | if (radio.RegIrqFlags.bits.PayloadCrcError) |
dudmuck | 0:be215de91a68 | 65 | printf("[41mPayloadCrcError[0m "); |
dudmuck | 0:be215de91a68 | 66 | if (radio.RegIrqFlags.bits.RxDone) |
dudmuck | 0:be215de91a68 | 67 | printf("[42mRxDone[0m "); |
dudmuck | 0:be215de91a68 | 68 | if (radio.RegIrqFlags.bits.RxTimeout) |
dudmuck | 0:be215de91a68 | 69 | printf("RxTimeout "); |
dudmuck | 0:be215de91a68 | 70 | |
dudmuck | 0:be215de91a68 | 71 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 72 | |
dudmuck | 0:be215de91a68 | 73 | if (clear) |
dudmuck | 0:be215de91a68 | 74 | radio.write_reg(REG_LR_IRQFLAGS, radio.RegIrqFlags.octet); |
dudmuck | 0:be215de91a68 | 75 | |
dudmuck | 0:be215de91a68 | 76 | } |
dudmuck | 0:be215de91a68 | 77 | |
dudmuck | 0:be215de91a68 | 78 | void printCodingRate(bool from_rx) |
dudmuck | 0:be215de91a68 | 79 | { |
dudmuck | 0:be215de91a68 | 80 | uint8_t d = radio.getCodingRate(from_rx); |
dudmuck | 0:be215de91a68 | 81 | printf("CodingRate:"); |
dudmuck | 0:be215de91a68 | 82 | switch (d) { |
dudmuck | 0:be215de91a68 | 83 | case 1: printf("4/5 "); break; |
dudmuck | 0:be215de91a68 | 84 | case 2: printf("4/6 "); break; |
dudmuck | 0:be215de91a68 | 85 | case 3: printf("4/7 "); break; |
dudmuck | 0:be215de91a68 | 86 | case 4: printf("4/8 "); break; |
dudmuck | 0:be215de91a68 | 87 | default: |
dudmuck | 0:be215de91a68 | 88 | printf("%d ", d); |
dudmuck | 0:be215de91a68 | 89 | break; |
dudmuck | 0:be215de91a68 | 90 | } |
dudmuck | 0:be215de91a68 | 91 | } |
dudmuck | 0:be215de91a68 | 92 | |
dudmuck | 0:be215de91a68 | 93 | void printHeaderMode() |
dudmuck | 0:be215de91a68 | 94 | { |
dudmuck | 0:be215de91a68 | 95 | if (radio.getHeaderMode()) |
dudmuck | 0:be215de91a68 | 96 | printf("implicit "); |
dudmuck | 0:be215de91a68 | 97 | else |
dudmuck | 0:be215de91a68 | 98 | printf("explicit "); |
dudmuck | 0:be215de91a68 | 99 | } |
dudmuck | 0:be215de91a68 | 100 | |
dudmuck | 0:be215de91a68 | 101 | void printBw() |
dudmuck | 0:be215de91a68 | 102 | { |
dudmuck | 0:be215de91a68 | 103 | uint8_t bw = radio.getBw(); |
dudmuck | 0:be215de91a68 | 104 | |
dudmuck | 0:be215de91a68 | 105 | printf("Bw:"); |
dudmuck | 0:be215de91a68 | 106 | if (radio.type == SX1276) { |
dudmuck | 0:be215de91a68 | 107 | switch (radio.RegModemConfig.sx1276bits.Bw) { |
dudmuck | 0:be215de91a68 | 108 | case 0: printf("7.8KHz "); break; |
dudmuck | 0:be215de91a68 | 109 | case 1: printf("10.4KHz "); break; |
dudmuck | 0:be215de91a68 | 110 | case 2: printf("15.6KHz "); break; |
dudmuck | 0:be215de91a68 | 111 | case 3: printf("20.8KHz "); break; |
dudmuck | 0:be215de91a68 | 112 | case 4: printf("31.25KHz "); break; |
dudmuck | 0:be215de91a68 | 113 | case 5: printf("41.7KHz "); break; |
dudmuck | 0:be215de91a68 | 114 | case 6: printf("62.5KHz "); break; |
dudmuck | 0:be215de91a68 | 115 | case 7: printf("125KHz "); break; |
dudmuck | 0:be215de91a68 | 116 | case 8: printf("250KHz "); break; |
dudmuck | 0:be215de91a68 | 117 | case 9: printf("500KHz "); break; |
dudmuck | 0:be215de91a68 | 118 | default: printf("%x ", radio.RegModemConfig.sx1276bits.Bw); break; |
dudmuck | 0:be215de91a68 | 119 | } |
dudmuck | 0:be215de91a68 | 120 | } else if (radio.type == SX1272) { |
dudmuck | 0:be215de91a68 | 121 | switch (radio.RegModemConfig.sx1272bits.Bw) { |
dudmuck | 0:be215de91a68 | 122 | case 0: printf("125KHz "); break; |
dudmuck | 0:be215de91a68 | 123 | case 1: printf("250KHz "); break; |
dudmuck | 0:be215de91a68 | 124 | case 2: printf("500KHz "); break; |
dudmuck | 0:be215de91a68 | 125 | case 3: printf("11b "); break; |
dudmuck | 0:be215de91a68 | 126 | } |
dudmuck | 0:be215de91a68 | 127 | } |
dudmuck | 0:be215de91a68 | 128 | } |
dudmuck | 0:be215de91a68 | 129 | |
dudmuck | 0:be215de91a68 | 130 | void printAllBw() |
dudmuck | 0:be215de91a68 | 131 | { |
dudmuck | 0:be215de91a68 | 132 | int i, s; |
dudmuck | 0:be215de91a68 | 133 | |
dudmuck | 0:be215de91a68 | 134 | if (radio.type == SX1276) { |
dudmuck | 0:be215de91a68 | 135 | s = radio.RegModemConfig.sx1276bits.Bw; |
dudmuck | 0:be215de91a68 | 136 | for (i = 0; i < 10; i++ ) { |
dudmuck | 0:be215de91a68 | 137 | radio.RegModemConfig.sx1276bits.Bw = i; |
dudmuck | 0:be215de91a68 | 138 | printf("%d ", i); |
dudmuck | 0:be215de91a68 | 139 | printBw(); |
dudmuck | 0:be215de91a68 | 140 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 141 | } |
dudmuck | 0:be215de91a68 | 142 | radio.RegModemConfig.sx1276bits.Bw = s; |
dudmuck | 0:be215de91a68 | 143 | } else if (radio.type == SX1272) { |
dudmuck | 0:be215de91a68 | 144 | s = radio.RegModemConfig.sx1272bits.Bw; |
dudmuck | 0:be215de91a68 | 145 | for (i = 0; i < 3; i++ ) { |
dudmuck | 0:be215de91a68 | 146 | radio.RegModemConfig.sx1272bits.Bw = i; |
dudmuck | 0:be215de91a68 | 147 | printf("%d ", i); |
dudmuck | 0:be215de91a68 | 148 | printBw(); |
dudmuck | 0:be215de91a68 | 149 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 150 | } |
dudmuck | 0:be215de91a68 | 151 | radio.RegModemConfig.sx1272bits.Bw = s; |
dudmuck | 0:be215de91a68 | 152 | } |
dudmuck | 0:be215de91a68 | 153 | } |
dudmuck | 0:be215de91a68 | 154 | |
dudmuck | 0:be215de91a68 | 155 | void printSf() |
dudmuck | 0:be215de91a68 | 156 | { |
dudmuck | 0:be215de91a68 | 157 | // spreading factor same between sx127[26] |
dudmuck | 0:be215de91a68 | 158 | printf("sf:%d ", radio.getSf()); |
dudmuck | 0:be215de91a68 | 159 | } |
dudmuck | 0:be215de91a68 | 160 | |
dudmuck | 0:be215de91a68 | 161 | void printRxPayloadCrcOn() |
dudmuck | 0:be215de91a68 | 162 | { |
dudmuck | 0:be215de91a68 | 163 | bool on = radio.getRxPayloadCrcOn(); |
dudmuck | 0:be215de91a68 | 164 | //printf("RxPayloadCrcOn:%s ", on ? "on" : "off"); |
dudmuck | 0:be215de91a68 | 165 | if (on) |
dudmuck | 0:be215de91a68 | 166 | printf("RxPayloadCrcOn:1 = Tx CRC Enabled\r\n"); |
dudmuck | 0:be215de91a68 | 167 | else |
dudmuck | 0:be215de91a68 | 168 | printf("RxPayloadCrcOn:1 = no Tx CRC\r\n"); |
dudmuck | 0:be215de91a68 | 169 | } |
dudmuck | 0:be215de91a68 | 170 | |
dudmuck | 0:be215de91a68 | 171 | void printTxContinuousMode() |
dudmuck | 0:be215de91a68 | 172 | { |
dudmuck | 0:be215de91a68 | 173 | printf("TxContinuousMode:%d ", radio.RegModemConfig2.sx1276bits.TxContinuousMode); // same for sx1272 and sx1276 |
dudmuck | 0:be215de91a68 | 174 | } |
dudmuck | 0:be215de91a68 | 175 | |
dudmuck | 0:be215de91a68 | 176 | void printAgcAutoOn() |
dudmuck | 0:be215de91a68 | 177 | { |
dudmuck | 0:be215de91a68 | 178 | printf("AgcAutoOn:%d", radio.getAgcAutoOn()); |
dudmuck | 0:be215de91a68 | 179 | } |
dudmuck | 0:be215de91a68 | 180 | |
dudmuck | 0:be215de91a68 | 181 | void print_dio() |
dudmuck | 0:be215de91a68 | 182 | { |
dudmuck | 0:be215de91a68 | 183 | radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2); |
dudmuck | 0:be215de91a68 | 184 | printf("DIO5:"); |
dudmuck | 0:be215de91a68 | 185 | switch (radio.RegDioMapping2.bits.Dio5Mapping) { |
dudmuck | 0:be215de91a68 | 186 | case 0: printf("ModeReady"); break; |
dudmuck | 0:be215de91a68 | 187 | case 1: printf("ClkOut"); break; |
dudmuck | 0:be215de91a68 | 188 | case 2: printf("ClkOut"); break; |
dudmuck | 0:be215de91a68 | 189 | } |
dudmuck | 0:be215de91a68 | 190 | printf(" DIO4:"); |
dudmuck | 0:be215de91a68 | 191 | switch (radio.RegDioMapping2.bits.Dio4Mapping) { |
dudmuck | 0:be215de91a68 | 192 | case 0: printf("CadDetected"); break; |
dudmuck | 0:be215de91a68 | 193 | case 1: printf("PllLock"); break; |
dudmuck | 0:be215de91a68 | 194 | case 2: printf("PllLock"); break; |
dudmuck | 0:be215de91a68 | 195 | } |
dudmuck | 0:be215de91a68 | 196 | radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1); |
dudmuck | 0:be215de91a68 | 197 | printf(" DIO3:"); |
dudmuck | 0:be215de91a68 | 198 | switch (radio.RegDioMapping1.bits.Dio3Mapping) { |
dudmuck | 0:be215de91a68 | 199 | case 0: printf("CadDone"); break; |
dudmuck | 0:be215de91a68 | 200 | case 1: printf("ValidHeader"); break; |
dudmuck | 0:be215de91a68 | 201 | case 2: printf("PayloadCrcError"); break; |
dudmuck | 0:be215de91a68 | 202 | } |
dudmuck | 0:be215de91a68 | 203 | printf(" DIO2:"); |
dudmuck | 0:be215de91a68 | 204 | switch (radio.RegDioMapping1.bits.Dio2Mapping) { |
dudmuck | 0:be215de91a68 | 205 | case 0: |
dudmuck | 0:be215de91a68 | 206 | case 1: |
dudmuck | 0:be215de91a68 | 207 | case 2: |
dudmuck | 0:be215de91a68 | 208 | printf("FhssChangeChannel"); |
dudmuck | 0:be215de91a68 | 209 | break; |
dudmuck | 0:be215de91a68 | 210 | } |
dudmuck | 0:be215de91a68 | 211 | printf(" DIO1:"); |
dudmuck | 0:be215de91a68 | 212 | switch (radio.RegDioMapping1.bits.Dio1Mapping) { |
dudmuck | 0:be215de91a68 | 213 | case 0: printf("RxTimeout"); break; |
dudmuck | 0:be215de91a68 | 214 | case 1: printf("FhssChangeChannel"); break; |
dudmuck | 0:be215de91a68 | 215 | case 2: printf("CadDetected"); break; |
dudmuck | 0:be215de91a68 | 216 | } |
dudmuck | 0:be215de91a68 | 217 | printf(" DIO0:"); |
dudmuck | 0:be215de91a68 | 218 | switch (radio.RegDioMapping1.bits.Dio0Mapping) { |
dudmuck | 0:be215de91a68 | 219 | case 0: printf("RxDone"); break; |
dudmuck | 0:be215de91a68 | 220 | case 1: printf("TxDone"); break; |
dudmuck | 0:be215de91a68 | 221 | case 2: printf("CadDone"); break; |
dudmuck | 0:be215de91a68 | 222 | } |
dudmuck | 0:be215de91a68 | 223 | |
dudmuck | 0:be215de91a68 | 224 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 225 | } |
dudmuck | 0:be215de91a68 | 226 | |
dudmuck | 0:be215de91a68 | 227 | void lora_print_status() |
dudmuck | 0:be215de91a68 | 228 | { |
dudmuck | 0:be215de91a68 | 229 | uint8_t d; |
dudmuck | 0:be215de91a68 | 230 | |
dudmuck | 0:be215de91a68 | 231 | if (radio.type == SX1276) |
dudmuck | 0:be215de91a68 | 232 | printf("\r\nSX1276 "); |
dudmuck | 0:be215de91a68 | 233 | else if (radio.type == SX1272) |
dudmuck | 0:be215de91a68 | 234 | printf("\r\nSX1272 "); |
dudmuck | 0:be215de91a68 | 235 | |
dudmuck | 0:be215de91a68 | 236 | radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); |
dudmuck | 0:be215de91a68 | 237 | if (!radio.RegOpMode.bits.LongRangeMode) { |
dudmuck | 0:be215de91a68 | 238 | printf("FSK\r\n"); |
dudmuck | 0:be215de91a68 | 239 | return; |
dudmuck | 0:be215de91a68 | 240 | } |
dudmuck | 0:be215de91a68 | 241 | |
dudmuck | 0:be215de91a68 | 242 | print_dio(); |
dudmuck | 0:be215de91a68 | 243 | printf("LoRa "); |
dudmuck | 0:be215de91a68 | 244 | |
dudmuck | 0:be215de91a68 | 245 | // printing LoRa registers at 0x0d -> 0x3f |
dudmuck | 0:be215de91a68 | 246 | |
dudmuck | 0:be215de91a68 | 247 | radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG); |
dudmuck | 0:be215de91a68 | 248 | radio.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2); |
dudmuck | 0:be215de91a68 | 249 | |
dudmuck | 0:be215de91a68 | 250 | printCodingRate(false); // false: transmitted coding rate |
dudmuck | 0:be215de91a68 | 251 | printHeaderMode(); |
dudmuck | 0:be215de91a68 | 252 | printBw(); |
dudmuck | 0:be215de91a68 | 253 | printSf(); |
dudmuck | 0:be215de91a68 | 254 | printRxPayloadCrcOn(); |
dudmuck | 0:be215de91a68 | 255 | // RegModemStat |
dudmuck | 0:be215de91a68 | 256 | printf("ModemStat:0x%02x\r\n", radio.read_reg(REG_LR_MODEMSTAT)); |
dudmuck | 0:be215de91a68 | 257 | |
dudmuck | 0:be215de91a68 | 258 | // fifo ptrs: |
dudmuck | 0:be215de91a68 | 259 | radio.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH); |
dudmuck | 0:be215de91a68 | 260 | radio.RegRxMaxPayloadLength = radio.read_reg(REG_LR_RX_MAX_PAYLOADLENGTH); |
dudmuck | 0:be215de91a68 | 261 | printf("fifoptr=0x%02x txbase=0x%02x rxbase=0x%02x payloadLength=0x%02x maxlen=0x%02x", |
dudmuck | 0:be215de91a68 | 262 | radio.read_reg(REG_LR_FIFOADDRPTR), |
dudmuck | 0:be215de91a68 | 263 | radio.read_reg(REG_LR_FIFOTXBASEADDR), |
dudmuck | 0:be215de91a68 | 264 | radio.read_reg(REG_LR_FIFORXBASEADDR), |
dudmuck | 0:be215de91a68 | 265 | radio.RegPayloadLength, |
dudmuck | 0:be215de91a68 | 266 | radio.RegRxMaxPayloadLength |
dudmuck | 0:be215de91a68 | 267 | ); |
dudmuck | 0:be215de91a68 | 268 | |
dudmuck | 0:be215de91a68 | 269 | radio.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS); |
dudmuck | 0:be215de91a68 | 270 | printLoraIrqs_(false); |
dudmuck | 0:be215de91a68 | 271 | |
dudmuck | 0:be215de91a68 | 272 | radio.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD); |
dudmuck | 0:be215de91a68 | 273 | if (radio.RegHopPeriod != 0) { |
dudmuck | 0:be215de91a68 | 274 | printf("\r\nHopPeriod:0x%02x\r\n", radio.RegHopPeriod); |
dudmuck | 0:be215de91a68 | 275 | } |
dudmuck | 0:be215de91a68 | 276 | |
dudmuck | 0:be215de91a68 | 277 | printf("SymbTimeout:0x%03x ", radio.read_u16(REG_LR_MODEMCONFIG2) & 0x3ff); |
dudmuck | 0:be215de91a68 | 278 | |
dudmuck | 0:be215de91a68 | 279 | radio.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB); |
dudmuck | 0:be215de91a68 | 280 | printf("PreambleLength:0x%03x ", radio.RegPreamble); |
dudmuck | 0:be215de91a68 | 281 | |
dudmuck | 0:be215de91a68 | 282 | |
dudmuck | 0:be215de91a68 | 283 | if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE) { |
dudmuck | 0:be215de91a68 | 284 | d = radio.read_reg(REG_LR_RSSIVALUE); |
dudmuck | 0:be215de91a68 | 285 | printf("rssi:%ddBm ", d-120); |
dudmuck | 0:be215de91a68 | 286 | } |
dudmuck | 0:be215de91a68 | 287 | |
dudmuck | 0:be215de91a68 | 288 | printTxContinuousMode(); |
dudmuck | 0:be215de91a68 | 289 | |
dudmuck | 0:be215de91a68 | 290 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 291 | printAgcAutoOn(); |
dudmuck | 0:be215de91a68 | 292 | if (radio.type == SX1272) { |
dudmuck | 0:be215de91a68 | 293 | printf(" LowDataRateOptimize:%d\r\n", radio.RegModemConfig.sx1272bits.LowDataRateOptimize); |
dudmuck | 0:be215de91a68 | 294 | } |
dudmuck | 0:be215de91a68 | 295 | |
dudmuck | 0:be215de91a68 | 296 | printf("\r\nHeaderCount:%d PacketCount:%d, ", |
dudmuck | 0:be215de91a68 | 297 | radio.read_u16(REG_LR_RXHEADERCNTVALUE_MSB), radio.read_u16(REG_LR_RXPACKETCNTVALUE_MSB)); |
dudmuck | 0:be215de91a68 | 298 | |
dudmuck | 0:be215de91a68 | 299 | printf("Lora detection threshold:%02x\r\n", radio.read_reg(REG_LR_DETECTION_THRESHOLD)); |
dudmuck | 0:be215de91a68 | 300 | radio.RegTest31.octet = radio.read_reg(REG_LR_TEST31); |
dudmuck | 0:be215de91a68 | 301 | printf("detect_trig_same_peaks_nb:%d\r\n", radio.RegTest31.bits.detect_trig_same_peaks_nb); |
dudmuck | 0:be215de91a68 | 302 | |
dudmuck | 0:be215de91a68 | 303 | if (radio.type == SX1272) { |
dudmuck | 0:be215de91a68 | 304 | radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG); |
dudmuck | 0:be215de91a68 | 305 | printf("LowDataRateOptimize:%d\r\n", radio.RegModemConfig.sx1272bits.LowDataRateOptimize); |
dudmuck | 0:be215de91a68 | 306 | } else if (radio.type == SX1276) { |
dudmuck | 0:be215de91a68 | 307 | radio.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3); |
dudmuck | 0:be215de91a68 | 308 | printf("LowDataRateOptimize:%d\r\n", radio.RegModemConfig3.sx1276bits.LowDataRateOptimize); |
dudmuck | 0:be215de91a68 | 309 | } |
dudmuck | 0:be215de91a68 | 310 | |
dudmuck | 0:be215de91a68 | 311 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 312 | //printf("A %02x\r\n", radio.RegModemConfig2.octet); |
dudmuck | 0:be215de91a68 | 313 | } |
dudmuck | 0:be215de91a68 | 314 | |
dudmuck | 0:be215de91a68 | 315 | void printOpMode() |
dudmuck | 0:be215de91a68 | 316 | { |
dudmuck | 0:be215de91a68 | 317 | radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); |
dudmuck | 0:be215de91a68 | 318 | switch (radio.RegOpMode.bits.Mode) { |
dudmuck | 0:be215de91a68 | 319 | case RF_OPMODE_SLEEP: printf("[7msleep[0m"); break; |
dudmuck | 0:be215de91a68 | 320 | case RF_OPMODE_STANDBY: printf("[7mstby[0m"); break; |
dudmuck | 0:be215de91a68 | 321 | case RF_OPMODE_SYNTHESIZER_TX: printf("[33mfstx[0m"); break; |
dudmuck | 0:be215de91a68 | 322 | case RF_OPMODE_TRANSMITTER: printf("[31mtx[0m"); break; |
dudmuck | 0:be215de91a68 | 323 | case RF_OPMODE_SYNTHESIZER_RX: printf("[33mfsrx[0m"); break; |
dudmuck | 0:be215de91a68 | 324 | case RF_OPMODE_RECEIVER: printf("[32mrx[0m"); break; |
dudmuck | 0:be215de91a68 | 325 | case 6: |
dudmuck | 0:be215de91a68 | 326 | if (radio.RegOpMode.bits.LongRangeMode) |
dudmuck | 0:be215de91a68 | 327 | printf("[42mrxs[0m"); |
dudmuck | 0:be215de91a68 | 328 | else |
dudmuck | 0:be215de91a68 | 329 | printf("-6-"); |
dudmuck | 0:be215de91a68 | 330 | break; // todo: different lora/fsk |
dudmuck | 0:be215de91a68 | 331 | case 7: |
dudmuck | 0:be215de91a68 | 332 | if (radio.RegOpMode.bits.LongRangeMode) |
dudmuck | 0:be215de91a68 | 333 | printf("[45mcad[0m"); |
dudmuck | 0:be215de91a68 | 334 | else |
dudmuck | 0:be215de91a68 | 335 | printf("-7-"); |
dudmuck | 0:be215de91a68 | 336 | break; // todo: different lora/fsk |
dudmuck | 0:be215de91a68 | 337 | } |
dudmuck | 0:be215de91a68 | 338 | } |
dudmuck | 0:be215de91a68 | 339 | |
dudmuck | 0:be215de91a68 | 340 | void |
dudmuck | 0:be215de91a68 | 341 | printPa() |
dudmuck | 0:be215de91a68 | 342 | { |
dudmuck | 0:be215de91a68 | 343 | radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); |
dudmuck | 0:be215de91a68 | 344 | if (radio.RegPaConfig.bits.PaSelect) { |
dudmuck | 0:be215de91a68 | 345 | float output_dBm = 17 - (15-radio.RegPaConfig.bits.OutputPower); |
dudmuck | 0:be215de91a68 | 346 | printf(" PABOOST OutputPower=%.1fdBm", output_dBm); |
dudmuck | 0:be215de91a68 | 347 | } else { |
dudmuck | 0:be215de91a68 | 348 | float pmax = (0.6*radio.RegPaConfig.bits.MaxPower) + 10.8; |
dudmuck | 0:be215de91a68 | 349 | float output_dBm = pmax - (15-radio.RegPaConfig.bits.OutputPower); |
dudmuck | 0:be215de91a68 | 350 | printf(" RFO pmax=%.1fdBm OutputPower=%.1fdBm", pmax, output_dBm); |
dudmuck | 0:be215de91a68 | 351 | } |
dudmuck | 0:be215de91a68 | 352 | } |
dudmuck | 0:be215de91a68 | 353 | |
dudmuck | 0:be215de91a68 | 354 | void /* things always present, whether lora or fsk */ |
dudmuck | 0:be215de91a68 | 355 | common_print_status() |
dudmuck | 0:be215de91a68 | 356 | { |
dudmuck | 0:be215de91a68 | 357 | printf("version:0x%02x %.3fMHz ", radio.read_reg(REG_VERSION), radio.get_frf_MHz()); |
dudmuck | 0:be215de91a68 | 358 | printOpMode(); |
dudmuck | 0:be215de91a68 | 359 | |
dudmuck | 0:be215de91a68 | 360 | printPa(); |
dudmuck | 0:be215de91a68 | 361 | |
dudmuck | 0:be215de91a68 | 362 | radio.RegOcp.octet = radio.read_reg(REG_OCP); |
dudmuck | 0:be215de91a68 | 363 | if (radio.RegOcp.bits.OcpOn) { |
dudmuck | 0:be215de91a68 | 364 | int imax = 0; |
dudmuck | 0:be215de91a68 | 365 | if (radio.RegOcp.bits.OcpTrim < 16) |
dudmuck | 0:be215de91a68 | 366 | imax = 45 + (5 * radio.RegOcp.bits.OcpTrim); |
dudmuck | 0:be215de91a68 | 367 | else if (radio.RegOcp.bits.OcpTrim < 28) |
dudmuck | 0:be215de91a68 | 368 | imax = -30 + (10 * radio.RegOcp.bits.OcpTrim); |
dudmuck | 0:be215de91a68 | 369 | else |
dudmuck | 0:be215de91a68 | 370 | imax = 240; |
dudmuck | 0:be215de91a68 | 371 | printf(" OcpOn %dmA ", imax); |
dudmuck | 0:be215de91a68 | 372 | } else |
dudmuck | 0:be215de91a68 | 373 | printf(" OcpOFF "); |
dudmuck | 0:be215de91a68 | 374 | |
dudmuck | 0:be215de91a68 | 375 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 376 | |
dudmuck | 0:be215de91a68 | 377 | } |
dudmuck | 0:be215de91a68 | 378 | |
dudmuck | 0:be215de91a68 | 379 | void print_rx_buf(int len) |
dudmuck | 0:be215de91a68 | 380 | { |
dudmuck | 0:be215de91a68 | 381 | int i; |
dudmuck | 0:be215de91a68 | 382 | |
dudmuck | 0:be215de91a68 | 383 | printf("000:"); |
dudmuck | 0:be215de91a68 | 384 | for (i = 0; i < len; i++) { |
dudmuck | 0:be215de91a68 | 385 | //printf("(%d)%02x ", i % 16, rx_buf[i]); |
dudmuck | 0:be215de91a68 | 386 | printf("%02x ", radio.rx_buf[i]); |
dudmuck | 0:be215de91a68 | 387 | if (i % 16 == 15 && i != len-1) |
dudmuck | 0:be215de91a68 | 388 | printf("\r\n%03d:", i+1); |
dudmuck | 0:be215de91a68 | 389 | |
dudmuck | 0:be215de91a68 | 390 | } |
dudmuck | 0:be215de91a68 | 391 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 392 | } |
dudmuck | 0:be215de91a68 | 393 | |
dudmuck | 0:be215de91a68 | 394 | void |
dudmuck | 0:be215de91a68 | 395 | service_radio() |
dudmuck | 0:be215de91a68 | 396 | { |
dudmuck | 0:be215de91a68 | 397 | service_action_e act = radio.service(); |
dudmuck | 0:be215de91a68 | 398 | |
dudmuck | 0:be215de91a68 | 399 | switch (act) { |
dudmuck | 0:be215de91a68 | 400 | case SERVICE_READ_FIFO: |
dudmuck | 0:be215de91a68 | 401 | if (app == APP_NONE) { |
dudmuck | 0:be215de91a68 | 402 | printLoraIrqs_(false); |
dudmuck | 0:be215de91a68 | 403 | if (radio.RegHopPeriod > 0) { |
dudmuck | 0:be215de91a68 | 404 | radio.RegHopChannel.octet = radio.read_reg(REG_LR_HOPCHANNEL); |
dudmuck | 0:be215de91a68 | 405 | printf("HopCH:%d ", radio.RegHopChannel.bits.FhssPresentChannel); |
dudmuck | 0:be215de91a68 | 406 | } |
dudmuck | 0:be215de91a68 | 407 | printCodingRate(true); // true: of received packet |
dudmuck | 0:be215de91a68 | 408 | printf(" crc%s %.1fdB %ddBm\r\n", |
dudmuck | 0:be215de91a68 | 409 | radio.RegHopChannel.bits.RxPayloadCrcOn ? "On" : "OFF", |
dudmuck | 0:be215de91a68 | 410 | radio.RegPktSnrValue / 4.0, |
dudmuck | 0:be215de91a68 | 411 | radio.RegPktRssiValue - 137 |
dudmuck | 0:be215de91a68 | 412 | ); |
dudmuck | 0:be215de91a68 | 413 | print_rx_buf(radio.RegRxNbBytes); |
dudmuck | 0:be215de91a68 | 414 | } else if (app == APP_CHAT) { |
dudmuck | 0:be215de91a68 | 415 | if (radio.RegHopChannel.bits.RxPayloadCrcOn) { |
dudmuck | 0:be215de91a68 | 416 | if (radio.RegIrqFlags.bits.PayloadCrcError) |
dudmuck | 0:be215de91a68 | 417 | printf("crcError\r\n"); |
dudmuck | 0:be215de91a68 | 418 | else { |
dudmuck | 0:be215de91a68 | 419 | int n = radio.RegRxNbBytes; |
dudmuck | 0:be215de91a68 | 420 | radio.rx_buf[n++] = '\r'; |
dudmuck | 0:be215de91a68 | 421 | radio.rx_buf[n++] = '\n'; |
dudmuck | 0:be215de91a68 | 422 | radio.rx_buf[n] = 0; // null terminate |
dudmuck | 0:be215de91a68 | 423 | printf((char *)radio.rx_buf); |
dudmuck | 0:be215de91a68 | 424 | } |
dudmuck | 0:be215de91a68 | 425 | } else |
dudmuck | 0:be215de91a68 | 426 | printf("crcOff\r\n"); |
dudmuck | 0:be215de91a68 | 427 | |
dudmuck | 0:be215de91a68 | 428 | // clear Irq flags |
dudmuck | 0:be215de91a68 | 429 | radio.write_reg(REG_LR_IRQFLAGS, radio.RegIrqFlags.octet); |
dudmuck | 0:be215de91a68 | 430 | // should still be in receive mode |
dudmuck | 0:be215de91a68 | 431 | } |
dudmuck | 0:be215de91a68 | 432 | break; |
dudmuck | 0:be215de91a68 | 433 | case SERVICE_TX_DONE: |
dudmuck | 0:be215de91a68 | 434 | if (app == APP_CHAT) { |
dudmuck | 0:be215de91a68 | 435 | radio.lora_start_rx(); |
dudmuck | 0:be215de91a68 | 436 | } |
dudmuck | 0:be215de91a68 | 437 | break; |
dudmuck | 0:be215de91a68 | 438 | case SERVICE_ERROR: |
dudmuck | 0:be215de91a68 | 439 | printf("error\r\n"); |
dudmuck | 0:be215de91a68 | 440 | break; |
dudmuck | 0:be215de91a68 | 441 | } // ...switch (act) |
dudmuck | 0:be215de91a68 | 442 | } |
dudmuck | 0:be215de91a68 | 443 | |
dudmuck | 0:be215de91a68 | 444 | void user_init(void) |
dudmuck | 0:be215de91a68 | 445 | { |
dudmuck | 0:be215de91a68 | 446 | // set desired spreadingfactor, bandwidth, MHz, etc. |
dudmuck | 0:be215de91a68 | 447 | } |
dudmuck | 0:be215de91a68 | 448 | |
dudmuck | 0:be215de91a68 | 449 | int get_kbd_str(char* buf, int size) |
dudmuck | 0:be215de91a68 | 450 | { |
dudmuck | 0:be215de91a68 | 451 | char c; |
dudmuck | 0:be215de91a68 | 452 | int i; |
dudmuck | 0:be215de91a68 | 453 | static int prev_len; |
dudmuck | 0:be215de91a68 | 454 | |
dudmuck | 0:be215de91a68 | 455 | for (i = 0;;) { |
dudmuck | 0:be215de91a68 | 456 | if (pc.readable()) { |
dudmuck | 0:be215de91a68 | 457 | c = pc.getc(); |
dudmuck | 0:be215de91a68 | 458 | if (c == 8 && i > 0) { |
dudmuck | 0:be215de91a68 | 459 | pc.putc(8); |
dudmuck | 0:be215de91a68 | 460 | pc.putc(' '); |
dudmuck | 0:be215de91a68 | 461 | pc.putc(8); |
dudmuck | 0:be215de91a68 | 462 | i--; |
dudmuck | 0:be215de91a68 | 463 | } else if (c == '\r') { |
dudmuck | 0:be215de91a68 | 464 | if (i == 0) { |
dudmuck | 0:be215de91a68 | 465 | return prev_len; // repeat previous |
dudmuck | 0:be215de91a68 | 466 | } else { |
dudmuck | 0:be215de91a68 | 467 | buf[i] = 0; // null terminate |
dudmuck | 0:be215de91a68 | 468 | prev_len = i; |
dudmuck | 0:be215de91a68 | 469 | return i; |
dudmuck | 0:be215de91a68 | 470 | } |
dudmuck | 0:be215de91a68 | 471 | } else if (c == 3) { |
dudmuck | 0:be215de91a68 | 472 | // ctrl-C abort |
dudmuck | 0:be215de91a68 | 473 | return -1; |
dudmuck | 0:be215de91a68 | 474 | } else if (i < size) { |
dudmuck | 0:be215de91a68 | 475 | buf[i++] = c; |
dudmuck | 0:be215de91a68 | 476 | pc.putc(c); |
dudmuck | 0:be215de91a68 | 477 | } |
dudmuck | 0:be215de91a68 | 478 | } else |
dudmuck | 0:be215de91a68 | 479 | service_radio(); |
dudmuck | 0:be215de91a68 | 480 | } // ...for() |
dudmuck | 0:be215de91a68 | 481 | } |
dudmuck | 0:be215de91a68 | 482 | |
dudmuck | 0:be215de91a68 | 483 | void |
dudmuck | 0:be215de91a68 | 484 | console_chat() |
dudmuck | 0:be215de91a68 | 485 | { |
dudmuck | 0:be215de91a68 | 486 | int i, len = get_kbd_str(pcbuf, sizeof(pcbuf)); |
dudmuck | 0:be215de91a68 | 487 | if (len < 0) { |
dudmuck | 0:be215de91a68 | 488 | printf("chat abort\r\n"); |
dudmuck | 0:be215de91a68 | 489 | app = APP_NONE; |
dudmuck | 0:be215de91a68 | 490 | return; |
dudmuck | 0:be215de91a68 | 491 | } else { |
dudmuck | 0:be215de91a68 | 492 | for (i = 0; i < len; i++) |
dudmuck | 0:be215de91a68 | 493 | radio.tx_buf[i] = pcbuf[i]; |
dudmuck | 0:be215de91a68 | 494 | radio.RegPayloadLength = len; |
dudmuck | 0:be215de91a68 | 495 | radio.write_reg(REG_LR_PAYLOADLENGTH, radio.RegPayloadLength); |
dudmuck | 0:be215de91a68 | 496 | radio.lora_start_tx(len); |
dudmuck | 0:be215de91a68 | 497 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 498 | } |
dudmuck | 0:be215de91a68 | 499 | } |
dudmuck | 0:be215de91a68 | 500 | |
dudmuck | 0:be215de91a68 | 501 | void |
dudmuck | 0:be215de91a68 | 502 | console() |
dudmuck | 0:be215de91a68 | 503 | { |
dudmuck | 0:be215de91a68 | 504 | int len, i; |
dudmuck | 0:be215de91a68 | 505 | uint8_t a, d; |
dudmuck | 0:be215de91a68 | 506 | |
dudmuck | 0:be215de91a68 | 507 | len = get_kbd_str(pcbuf, sizeof(pcbuf)); |
dudmuck | 0:be215de91a68 | 508 | if (len < 0) { |
dudmuck | 0:be215de91a68 | 509 | printf("abort\r\n"); |
dudmuck | 0:be215de91a68 | 510 | return; |
dudmuck | 0:be215de91a68 | 511 | } |
dudmuck | 0:be215de91a68 | 512 | |
dudmuck | 0:be215de91a68 | 513 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 514 | if (len == 1) { |
dudmuck | 0:be215de91a68 | 515 | switch (pcbuf[0]) { |
dudmuck | 0:be215de91a68 | 516 | case 'i': |
dudmuck | 0:be215de91a68 | 517 | radio.init(); |
dudmuck | 0:be215de91a68 | 518 | user_init(); |
dudmuck | 0:be215de91a68 | 519 | break; |
dudmuck | 0:be215de91a68 | 520 | case 'h': |
dudmuck | 0:be215de91a68 | 521 | printf("hw_reset()\r\n"); |
dudmuck | 0:be215de91a68 | 522 | radio.hw_reset(); |
dudmuck | 0:be215de91a68 | 523 | break; |
dudmuck | 0:be215de91a68 | 524 | case 'R': |
dudmuck | 0:be215de91a68 | 525 | // read all registers |
dudmuck | 0:be215de91a68 | 526 | for (a = 1; a < 0x71; a++) { |
dudmuck | 0:be215de91a68 | 527 | d = radio.read_reg(a); |
dudmuck | 0:be215de91a68 | 528 | //update_shadow_regs(selected_radio, a, d); |
dudmuck | 0:be215de91a68 | 529 | printf("%02x: %02x\r\n", a, d); |
dudmuck | 0:be215de91a68 | 530 | } |
dudmuck | 0:be215de91a68 | 531 | break; |
dudmuck | 0:be215de91a68 | 532 | case 'T': |
dudmuck | 0:be215de91a68 | 533 | radio.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2); |
dudmuck | 0:be215de91a68 | 534 | //printf("a %02x\r\n", radio.RegModemConfig2.octet); |
dudmuck | 0:be215de91a68 | 535 | radio.RegModemConfig2.sx1276bits.TxContinuousMode ^= 1; // same for sx1272 and sx1276 |
dudmuck | 0:be215de91a68 | 536 | //printf("b %02x\r\n", radio.RegModemConfig2.octet); |
dudmuck | 0:be215de91a68 | 537 | radio.write_reg(REG_LR_MODEMCONFIG2, radio.RegModemConfig2.octet); |
dudmuck | 0:be215de91a68 | 538 | radio.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG); |
dudmuck | 0:be215de91a68 | 539 | //printf("c %02x\r\n", radio.RegModemConfig2.octet); |
dudmuck | 0:be215de91a68 | 540 | printTxContinuousMode(); |
dudmuck | 0:be215de91a68 | 541 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 542 | break; |
dudmuck | 0:be215de91a68 | 543 | case 'C': |
dudmuck | 0:be215de91a68 | 544 | radio.setRxPayloadCrcOn(!radio.getRxPayloadCrcOn()); |
dudmuck | 0:be215de91a68 | 545 | printRxPayloadCrcOn(); |
dudmuck | 0:be215de91a68 | 546 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 547 | break; |
dudmuck | 0:be215de91a68 | 548 | case 'B': |
dudmuck | 0:be215de91a68 | 549 | radio.RegPaConfig.bits.PaSelect ^= 1; |
dudmuck | 0:be215de91a68 | 550 | radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet); |
dudmuck | 0:be215de91a68 | 551 | printPa(); |
dudmuck | 0:be215de91a68 | 552 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 553 | break; |
dudmuck | 0:be215de91a68 | 554 | case '?': |
dudmuck | 0:be215de91a68 | 555 | printf("i radio_init\r\n"); |
dudmuck | 0:be215de91a68 | 556 | printf("h hw_reset\r\n"); |
dudmuck | 0:be215de91a68 | 557 | printf("hm toggle explicit/explicit header mode\r\n"); |
dudmuck | 0:be215de91a68 | 558 | printf("tx[ %%d] transmit\r\n"); |
dudmuck | 0:be215de91a68 | 559 | printf("rx receive\r\n"); |
dudmuck | 0:be215de91a68 | 560 | printf("cr[1234] set coding rate\r\n"); |
dudmuck | 0:be215de91a68 | 561 | printf("bw[%%d] get/set bandwidth\r\n"); |
dudmuck | 0:be215de91a68 | 562 | printf("sf[%%d] get/set spreading factor\r\n"); |
dudmuck | 0:be215de91a68 | 563 | printf("pl[%%d] get/set RegPayloadLength\r\n"); |
dudmuck | 0:be215de91a68 | 564 | printf("C toggle crcOn\r\n"); |
dudmuck | 0:be215de91a68 | 565 | printf("T toggle TxContinuousMode\r\n"); |
dudmuck | 0:be215de91a68 | 566 | printf("op[%%d] get/set output power\r\n"); |
dudmuck | 0:be215de91a68 | 567 | printf("hp[%%d] get/set hop period\r\n"); |
dudmuck | 0:be215de91a68 | 568 | printf("d[0-5] change DIO pin assignment\r\n"); |
dudmuck | 0:be215de91a68 | 569 | break; |
dudmuck | 0:be215de91a68 | 570 | case '.': |
dudmuck | 0:be215de91a68 | 571 | lora_print_status(); |
dudmuck | 0:be215de91a68 | 572 | common_print_status(); |
dudmuck | 0:be215de91a68 | 573 | break; |
dudmuck | 0:be215de91a68 | 574 | } // ...switch (pcbuf[0]) |
dudmuck | 0:be215de91a68 | 575 | } else { |
dudmuck | 0:be215de91a68 | 576 | if (pcbuf[0] == 't' && pcbuf[1] == 'x') { // TX |
dudmuck | 0:be215de91a68 | 577 | if (pcbuf[2] == ' ') { |
dudmuck | 0:be215de91a68 | 578 | sscanf(pcbuf+3, "%d", &i); |
dudmuck | 0:be215de91a68 | 579 | radio.RegPayloadLength = i; |
dudmuck | 0:be215de91a68 | 580 | } |
dudmuck | 0:be215de91a68 | 581 | tx_cnt++; |
dudmuck | 0:be215de91a68 | 582 | for (i = 0; i < radio.RegPayloadLength; i++) |
dudmuck | 0:be215de91a68 | 583 | radio.tx_buf[i] = tx_cnt; |
dudmuck | 0:be215de91a68 | 584 | radio.lora_start_tx(radio.RegPayloadLength); |
dudmuck | 0:be215de91a68 | 585 | } else if (pcbuf[0] == 'h' && pcbuf[1] == 'p') { // |
dudmuck | 0:be215de91a68 | 586 | if (pcbuf[2] >= '0' && pcbuf[2] <= '9') { |
dudmuck | 0:be215de91a68 | 587 | sscanf(pcbuf+2, "%d", &i); |
dudmuck | 0:be215de91a68 | 588 | radio.RegHopPeriod = i; |
dudmuck | 0:be215de91a68 | 589 | radio.write_reg(REG_LR_HOPPERIOD, radio.RegHopPeriod); |
dudmuck | 0:be215de91a68 | 590 | if (radio.RegDioMapping1.bits.Dio1Mapping != 1) { |
dudmuck | 0:be215de91a68 | 591 | radio.RegDioMapping1.bits.Dio1Mapping = 1; |
dudmuck | 0:be215de91a68 | 592 | radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet); |
dudmuck | 0:be215de91a68 | 593 | } |
dudmuck | 0:be215de91a68 | 594 | } |
dudmuck | 0:be215de91a68 | 595 | radio.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD); |
dudmuck | 0:be215de91a68 | 596 | printf("HopPeriod:0x%02x\r\n", radio.RegHopPeriod); |
dudmuck | 0:be215de91a68 | 597 | } else if (pcbuf[0] == 'r' && pcbuf[1] == 'x') { // RX |
dudmuck | 0:be215de91a68 | 598 | radio.lora_start_rx(); |
dudmuck | 0:be215de91a68 | 599 | } else if (pcbuf[0] == 'r' && pcbuf[1] == ' ') { // read single register |
dudmuck | 0:be215de91a68 | 600 | sscanf(pcbuf+2, "%x", &i); |
dudmuck | 0:be215de91a68 | 601 | printf("%02x: %02x\r\n", i, radio.read_reg(i)); |
dudmuck | 0:be215de91a68 | 602 | } else if (pcbuf[0] == 'w' && pcbuf[1] == ' ') { // write single register |
dudmuck | 0:be215de91a68 | 603 | sscanf(pcbuf+2, "%x %x", &i, &len); |
dudmuck | 0:be215de91a68 | 604 | radio.write_reg(i, len); |
dudmuck | 0:be215de91a68 | 605 | printf("%02x: %02x\r\n", i, radio.read_reg(i)); |
dudmuck | 0:be215de91a68 | 606 | } else if (pcbuf[0] == 'o' && pcbuf[1] == 'p') { |
dudmuck | 0:be215de91a68 | 607 | if (pcbuf[2] >= '0' && pcbuf[2] <= '9') { |
dudmuck | 0:be215de91a68 | 608 | sscanf(pcbuf+2, "%d", &i); |
dudmuck | 0:be215de91a68 | 609 | radio.RegPaConfig.bits.OutputPower = i; |
dudmuck | 0:be215de91a68 | 610 | radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet); |
dudmuck | 0:be215de91a68 | 611 | } |
dudmuck | 0:be215de91a68 | 612 | radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); |
dudmuck | 0:be215de91a68 | 613 | printf("OutputPower:%d\r\n", radio.RegPaConfig.bits.OutputPower); |
dudmuck | 0:be215de91a68 | 614 | } else if (pcbuf[0] == 'c' && pcbuf[1] == 'r') { |
dudmuck | 0:be215de91a68 | 615 | if (pcbuf[2] >= '0' && pcbuf[2] <= '9') |
dudmuck | 0:be215de91a68 | 616 | radio.setCodingRate(pcbuf[2] - '0'); |
dudmuck | 0:be215de91a68 | 617 | radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG); |
dudmuck | 0:be215de91a68 | 618 | printCodingRate(false); // false: transmitted |
dudmuck | 0:be215de91a68 | 619 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 620 | } else if (pcbuf[0] == 'h' && pcbuf[1] == 'm') { // toggle implicit/explicit |
dudmuck | 0:be215de91a68 | 621 | radio.setHeaderMode(!radio.getHeaderMode()); |
dudmuck | 0:be215de91a68 | 622 | radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG); |
dudmuck | 0:be215de91a68 | 623 | printHeaderMode(); |
dudmuck | 0:be215de91a68 | 624 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 625 | } else if (pcbuf[0] == 'b' && pcbuf[1] == 'w') { |
dudmuck | 0:be215de91a68 | 626 | if (pcbuf[2] >= '0' && pcbuf[2] <= '9') { |
dudmuck | 0:be215de91a68 | 627 | radio.set_opmode(RF_OPMODE_STANDBY); |
dudmuck | 0:be215de91a68 | 628 | sscanf(&pcbuf[2], "%d", &i); |
dudmuck | 0:be215de91a68 | 629 | radio.setBw(i); |
dudmuck | 0:be215de91a68 | 630 | } else |
dudmuck | 0:be215de91a68 | 631 | printAllBw(); |
dudmuck | 0:be215de91a68 | 632 | radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG); |
dudmuck | 0:be215de91a68 | 633 | printf("current "); |
dudmuck | 0:be215de91a68 | 634 | printBw(); |
dudmuck | 0:be215de91a68 | 635 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 636 | } else if (pcbuf[0] == 'v' && pcbuf[1] == 'h') { |
dudmuck | 0:be215de91a68 | 637 | radio.poll_vh ^= 1; |
dudmuck | 0:be215de91a68 | 638 | printf("poll_vh:%d\r\n", radio.poll_vh); |
dudmuck | 0:be215de91a68 | 639 | } else if (pcbuf[0] == 's' && pcbuf[1] == 'f') { |
dudmuck | 0:be215de91a68 | 640 | if (pcbuf[2] >= '0' && pcbuf[2] <= '9') { |
dudmuck | 0:be215de91a68 | 641 | sscanf(pcbuf+2, "%d", &i); |
dudmuck | 0:be215de91a68 | 642 | radio.setSf(i); |
dudmuck | 0:be215de91a68 | 643 | if (i == 6 && !radio.getHeaderMode()) { |
dudmuck | 0:be215de91a68 | 644 | printf("SF6: to implicit header mode\r\n"); |
dudmuck | 0:be215de91a68 | 645 | radio.setHeaderMode(true); |
dudmuck | 0:be215de91a68 | 646 | } |
dudmuck | 0:be215de91a68 | 647 | } |
dudmuck | 0:be215de91a68 | 648 | radio.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2); |
dudmuck | 0:be215de91a68 | 649 | printSf(); |
dudmuck | 0:be215de91a68 | 650 | printf("\r\n"); |
dudmuck | 0:be215de91a68 | 651 | } else if (pcbuf[0] == 'f' && pcbuf[1] == 'r' && pcbuf[2] == 'f') { |
dudmuck | 0:be215de91a68 | 652 | if (pcbuf[3] >= '0' && pcbuf[3] <= '9') { |
dudmuck | 0:be215de91a68 | 653 | float MHz; |
dudmuck | 0:be215de91a68 | 654 | sscanf(pcbuf+3, "%f", &MHz); |
dudmuck | 0:be215de91a68 | 655 | //printf("MHz:%f\r\n", MHz); |
dudmuck | 0:be215de91a68 | 656 | radio.set_frf_MHz(MHz); |
dudmuck | 0:be215de91a68 | 657 | } else |
dudmuck | 0:be215de91a68 | 658 | printf("%fMHz\r\n", radio.get_frf_MHz()); |
dudmuck | 0:be215de91a68 | 659 | } else if (pcbuf[0] == 'p' && pcbuf[1] == 'l') { |
dudmuck | 0:be215de91a68 | 660 | if (pcbuf[2] >= '0' && pcbuf[2] <= '9') { |
dudmuck | 0:be215de91a68 | 661 | sscanf(pcbuf+2, "%d", &i); |
dudmuck | 0:be215de91a68 | 662 | radio.RegPayloadLength = i; |
dudmuck | 0:be215de91a68 | 663 | radio.write_reg(REG_LR_PAYLOADLENGTH, radio.RegPayloadLength); |
dudmuck | 0:be215de91a68 | 664 | } |
dudmuck | 0:be215de91a68 | 665 | radio.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH); |
dudmuck | 0:be215de91a68 | 666 | printf("PayloadLength:%d\r\n", radio.RegPayloadLength); |
dudmuck | 0:be215de91a68 | 667 | } else if (pcbuf[0] == 'd' && pcbuf[1] >= '0' && pcbuf[1] <= '5') { |
dudmuck | 0:be215de91a68 | 668 | switch (pcbuf[1]) { |
dudmuck | 0:be215de91a68 | 669 | case '0': |
dudmuck | 0:be215de91a68 | 670 | radio.RegDioMapping1.bits.Dio0Mapping++; |
dudmuck | 0:be215de91a68 | 671 | radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet); |
dudmuck | 0:be215de91a68 | 672 | break; |
dudmuck | 0:be215de91a68 | 673 | case '1': |
dudmuck | 0:be215de91a68 | 674 | radio.RegDioMapping1.bits.Dio1Mapping++; |
dudmuck | 0:be215de91a68 | 675 | radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet); |
dudmuck | 0:be215de91a68 | 676 | break; |
dudmuck | 0:be215de91a68 | 677 | case '2': |
dudmuck | 0:be215de91a68 | 678 | radio.RegDioMapping1.bits.Dio2Mapping++; |
dudmuck | 0:be215de91a68 | 679 | radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet); |
dudmuck | 0:be215de91a68 | 680 | break; |
dudmuck | 0:be215de91a68 | 681 | case '3': |
dudmuck | 0:be215de91a68 | 682 | radio.RegDioMapping1.bits.Dio3Mapping++; |
dudmuck | 0:be215de91a68 | 683 | radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet); |
dudmuck | 0:be215de91a68 | 684 | break; |
dudmuck | 0:be215de91a68 | 685 | case '4': |
dudmuck | 0:be215de91a68 | 686 | radio.RegDioMapping2.bits.Dio4Mapping++; |
dudmuck | 0:be215de91a68 | 687 | radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping2.octet); |
dudmuck | 0:be215de91a68 | 688 | break; |
dudmuck | 0:be215de91a68 | 689 | case '5': |
dudmuck | 0:be215de91a68 | 690 | radio.RegDioMapping2.bits.Dio5Mapping++; |
dudmuck | 0:be215de91a68 | 691 | radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping2.octet); |
dudmuck | 0:be215de91a68 | 692 | break; |
dudmuck | 0:be215de91a68 | 693 | } // ...switch (pcbuf[1]) |
dudmuck | 0:be215de91a68 | 694 | print_dio(); |
dudmuck | 0:be215de91a68 | 695 | } else if (pcbuf[0] == 's' && pcbuf[1] == 't' && pcbuf[2] == 'b') { |
dudmuck | 0:be215de91a68 | 696 | radio.set_opmode(RF_OPMODE_STANDBY); |
dudmuck | 0:be215de91a68 | 697 | } else if (pcbuf[0] == 's' && pcbuf[1] == 'l' && pcbuf[2] == 'e') { |
dudmuck | 0:be215de91a68 | 698 | radio.set_opmode(RF_OPMODE_SLEEP); |
dudmuck | 0:be215de91a68 | 699 | } else if (pcbuf[0] == 'c' && pcbuf[1] == 'h' && pcbuf[2] == 'a') { |
dudmuck | 0:be215de91a68 | 700 | app = APP_CHAT; |
dudmuck | 0:be215de91a68 | 701 | radio.lora_start_rx(); |
dudmuck | 0:be215de91a68 | 702 | printf("chat start\r\n"); |
dudmuck | 0:be215de91a68 | 703 | } |
dudmuck | 0:be215de91a68 | 704 | } |
dudmuck | 0:be215de91a68 | 705 | printf("> "); |
dudmuck | 0:be215de91a68 | 706 | fflush(stdout); |
dudmuck | 0:be215de91a68 | 707 | |
dudmuck | 0:be215de91a68 | 708 | } |
dudmuck | 0:be215de91a68 | 709 | |
dudmuck | 0:be215de91a68 | 710 | int main() |
dudmuck | 0:be215de91a68 | 711 | { |
dudmuck | 0:be215de91a68 | 712 | |
dudmuck | 0:be215de91a68 | 713 | pc.baud(57600); |
dudmuck | 0:be215de91a68 | 714 | user_init(); |
dudmuck | 0:be215de91a68 | 715 | |
dudmuck | 0:be215de91a68 | 716 | radio.frfs = frfs; |
dudmuck | 0:be215de91a68 | 717 | |
dudmuck | 0:be215de91a68 | 718 | while(1) { |
dudmuck | 0:be215de91a68 | 719 | switch (app) { |
dudmuck | 0:be215de91a68 | 720 | case APP_NONE: |
dudmuck | 0:be215de91a68 | 721 | console(); |
dudmuck | 0:be215de91a68 | 722 | break; |
dudmuck | 0:be215de91a68 | 723 | case APP_CHAT: |
dudmuck | 0:be215de91a68 | 724 | console_chat(); |
dudmuck | 0:be215de91a68 | 725 | break; |
dudmuck | 0:be215de91a68 | 726 | } // ...switch (app) |
dudmuck | 0:be215de91a68 | 727 | } // ...while(1) |
dudmuck | 0:be215de91a68 | 728 | } |
dudmuck | 0:be215de91a68 | 729 |