wayne roberts
/
CB-LORA-MR_utility
test sending sensor results over lora radio. Accelerometer and temp/pressure.
Embed:
(wiki syntax)
Show/hide line numbers
radio_sx127x.cpp
00001 #include "radio.h" 00002 #ifdef SX127x_H 00003 00004 const char* const Radio::chipNum_str = "SX127x"; 00005 00006 const RadioEvents_t* Radio::RadioEvents; 00007 LowPowerTimer Radio::lpt; 00008 uint8_t Radio::bw_idx; 00009 00010 RegPaRamp_t Radio::RegPaRamp; 00011 00012 const char* opModes[] = { 00013 "SLEEP ", // 0 00014 "STANDBY ", // 1 00015 "FS_TX ", // 2 00016 "TX ", // 3 00017 "FS_RX ", // 4 00018 "RX ", // 5 00019 "RX_SINGLE", // 6 00020 "CAD " // 7 00021 }; 00022 00023 const char* Radio::tx_ramp_strs[] = { 00024 "3400", // 0 00025 "2000", // 1 00026 "1000", // 2 00027 "500 ", // 3 00028 "250 ", // 4 00029 "125 ", // 5 00030 "100 ", // 6 00031 "62 ", // 7 00032 "50 ", // 8 00033 "40 ", // 9 00034 "31 ", // 10 00035 "25 ", // 11 00036 "20 ", // 12 00037 "15 ", // 13 00038 "12 ", // 14 00039 "10 ", // 15 00040 NULL 00041 }; 00042 00043 unsigned Radio::tx_ramp_read(bool fw) 00044 { 00045 RegPaRamp.octet = radio.read_reg(REG_PARAMP); 00046 return RegPaRamp.bits.PaRamp; 00047 } 00048 00049 menuMode_e Radio::tx_ramp_write(unsigned val) 00050 { 00051 RegPaRamp.octet = radio.read_reg(REG_PARAMP); 00052 00053 RegPaRamp.bits.PaRamp = val; 00054 radio.write_reg(REG_PARAMP, RegPaRamp.octet); 00055 00056 return MENUMODE_REDRAW; 00057 } 00058 00059 const char* const Radio::pktType_strs[] = { 00060 "FSK ", // 0 00061 "OOK ", // 1 00062 "LORA", // 2 00063 NULL 00064 }; 00065 00066 unsigned Radio::pktType_read(bool fw) 00067 { 00068 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); 00069 if (radio.RegOpMode.bits.LongRangeMode) 00070 return 2; 00071 else 00072 return radio.RegOpMode.bits.ModulationType; 00073 } 00074 00075 menuMode_e Radio::pktType_write(unsigned idx) 00076 { 00077 if (idx == 2) { 00078 if (!radio.RegOpMode.bits.LongRangeMode) { 00079 /* to lora */ 00080 radio.set_opmode(RF_OPMODE_SLEEP); 00081 radio.RegOpMode.bits.LongRangeMode = 1; 00082 wait_us(1000); 00083 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet); 00084 } 00085 } else { 00086 if (radio.RegOpMode.bits.LongRangeMode) { 00087 /* from lora */ 00088 radio.set_opmode(RF_OPMODE_SLEEP); 00089 radio.RegOpMode.bits.LongRangeMode = 0; 00090 wait_us(1000); 00091 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet); 00092 } 00093 00094 if (radio.RegOpMode.bits.ModulationType != idx) { 00095 radio.RegOpMode.bits.ModulationType = idx; 00096 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet); 00097 } 00098 } 00099 00100 return MENUMODE_REINIT_MENU; 00101 } 00102 00103 void Radio::hw_reset() 00104 { 00105 radio.hw_reset(); 00106 } 00107 00108 void Radio::clearIrqFlags() 00109 { 00110 if (radio.RegOpMode.bits.LongRangeMode) { 00111 radio.write_reg(REG_LR_IRQFLAGS, 0xff); // clear flags in radio 00112 } else { 00113 radio.write_reg(REG_FSK_IRQFLAGS1, 0x0b); 00114 radio.write_reg(REG_FSK_IRQFLAGS2, 0x11); 00115 } 00116 } 00117 00118 void Radio::readChip() 00119 { 00120 } 00121 00122 uint8_t Radio::get_payload_length() 00123 { 00124 if (radio.RegOpMode.bits.LongRangeMode) { 00125 lora.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH); 00126 return lora.RegPayloadLength; 00127 } else { 00128 fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2); 00129 return fsk.RegPktConfig2.bits.PayloadLength; 00130 } 00131 } 00132 00133 void Radio::set_payload_length(uint8_t len) 00134 { 00135 if (radio.RegOpMode.bits.LongRangeMode) { 00136 lora.RegPayloadLength = len; 00137 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength); 00138 } else { 00139 fsk.RegPktConfig2.bits.PayloadLength = len; 00140 radio.write_u16(REG_FSK_PACKETCONFIG2, fsk.RegPktConfig2.word); 00141 } 00142 } 00143 00144 void Radio::Rx() 00145 { 00146 if (radio.RegOpMode.bits.LongRangeMode) 00147 lora.start_rx(RF_OPMODE_RECEIVER); 00148 else 00149 fsk.start_rx(); 00150 } 00151 00152 void Radio::txPkt() 00153 { 00154 if (radio.RegOpMode.bits.LongRangeMode) { 00155 lora.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH); 00156 lora.start_tx(lora.RegPayloadLength); 00157 } else { 00158 fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2); 00159 //log_printf("fsk payLen %u\r\n", fsk.RegPktConfig2.bits.PayloadLength); 00160 fsk.start_tx(fsk.RegPktConfig2.bits.PayloadLength); 00161 } 00162 } 00163 00164 void Radio::tx_carrier() 00165 { 00166 radio.set_opmode(RF_OPMODE_SLEEP); 00167 fsk.enable(false); 00168 radio.write_u16(REG_FSK_FDEVMSB, 0); 00169 radio.write_u16(REG_FSK_PREAMBLEMSB, 0xffff); 00170 fsk.start_tx(8); 00171 } 00172 00173 void Radio::tx_preamble() 00174 { 00175 if (radio.RegOpMode.bits.LongRangeMode) { 00176 radio.write_u16(REG_LR_PREAMBLEMSB, 0xffff); 00177 lora.start_tx(8); 00178 } else { 00179 radio.write_u16(REG_FSK_PREAMBLEMSB, 0xffff); 00180 fsk.start_tx(8); 00181 } 00182 } 00183 00184 bool Radio::service(int8_t statusRow) 00185 { 00186 bool ret = false; 00187 static RegIrqFlags1_t prevRegIrqFlags1; 00188 static RegIrqFlags2_t prevRegIrqFlags2; 00189 static us_timestamp_t prev_now; 00190 us_timestamp_t now = lpt.read_us(); 00191 00192 if (radio.RegOpMode.bits.LongRangeMode) { 00193 const float bws[] = {7.8, 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250, 500}; 00194 int32_t est_freq_error; 00195 int idx, hz; 00196 service_action_e act = lora.service(); 00197 switch (act) { 00198 case SERVICE_READ_FIFO: 00199 est_freq_error = radio.read_reg(REG_LR_TEST28); 00200 est_freq_error <<= 8; 00201 est_freq_error += radio.read_reg(REG_LR_TEST29); 00202 est_freq_error <<= 8; 00203 est_freq_error += radio.read_reg(REG_LR_TEST2A); 00204 00205 if (est_freq_error & 0x80000) 00206 est_freq_error |= 0xfff00000; // extend sign from 20bit to 32bit 00207 00208 //log_printf("est_freq_error:%08x\r\n", est_freq_error); 00209 if (radio.type == SX1272) 00210 idx = bw_idx + 7; 00211 else 00212 idx = bw_idx; 00213 00214 hz = est_freq_error * -0.524288 * bws[idx] / 500; 00215 log_printf("hz:%d\r\n", hz); 00216 00217 RadioEvents->RxDone(lora.RegRxNbBytes, lora.get_pkt_rssi(), lora.RegPktSnrValue / 4.0); 00218 break; 00219 case SERVICE_TX_DONE: 00220 if (RadioEvents->TxDone_botHalf) 00221 RadioEvents->TxDone_botHalf(); 00222 break; 00223 case SERVICE_ERROR: 00224 case SERVICE_NONE: 00225 break; 00226 } 00227 00228 if (radio.RegOpMode.bits.Mode == RF_OPMODE_CAD) { 00229 if (radio.dio1 || radio.dio0) { 00230 RegIrqFlags_t irqFlags; 00231 irqFlags.octet = 0; 00232 log_printf("Cad: "); 00233 if (radio.dio0) { 00234 pc.printf("Done "); 00235 radio.RegOpMode.bits.Mode = RF_OPMODE_STANDBY; 00236 irqFlags.bits.CadDone = 1; 00237 } 00238 if (radio.dio1) { 00239 pc.printf("Detected"); 00240 irqFlags.bits.CadDetected = 1; 00241 } 00242 pc.printf("\r\n"); 00243 radio.write_reg(REG_LR_IRQFLAGS, irqFlags.octet); 00244 } 00245 } 00246 } else { 00247 service_action_e act = fsk.service(); 00248 switch (act) { 00249 case SERVICE_READ_FIFO: 00250 /*if (fsk.RegRxConfig.bits.AfcAutoOn) { 00251 printf("%dHz ", (int)(FREQ_STEP_HZ * fsk.RegAfcValue)); 00252 if (rssi != 0) { 00253 printf("pkt:-%.1fdBm ", rssi / 2.0); 00254 rssi = 0; 00255 } 00256 }*/ 00257 if (fsk.RegRxConfig.bits.AfcAutoOn) 00258 log_printf("%dHz\r\n", (int)(FREQ_STEP_HZ * fsk.RegAfcValue)); 00259 00260 RadioEvents->RxDone(fsk.rx_buf_length, /*TODO rssi*/0, 0); 00261 break; 00262 case SERVICE_TX_DONE: 00263 if (RadioEvents->TxDone_botHalf) 00264 RadioEvents->TxDone_botHalf(); 00265 break; 00266 case SERVICE_ERROR: 00267 case SERVICE_NONE: 00268 break; 00269 } 00270 00271 if (statusRow > 0 && now-prev_now > 50000) { 00272 RegIrqFlags1_t RegIrqFlags1; 00273 RegIrqFlags2_t RegIrqFlags2; 00274 00275 RegIrqFlags1.octet = radio.read_reg(REG_FSK_IRQFLAGS1); 00276 RegIrqFlags2.octet = radio.read_reg(REG_FSK_IRQFLAGS2); 00277 prev_now = now; 00278 00279 if (RegIrqFlags1.octet != prevRegIrqFlags1.octet || RegIrqFlags2.octet != prevRegIrqFlags2.octet) { 00280 00281 pc.printf("\e[%u;1f", statusRow); // set (force) cursor to row;column 00282 00283 if (RegIrqFlags1.bits.ModeReady) 00284 pc.printf("ModeReady "); 00285 if (RegIrqFlags1.bits.RxReady) 00286 pc.printf("RxReady "); 00287 if (RegIrqFlags1.bits.TxReady) 00288 pc.printf("TxReady "); 00289 if (RegIrqFlags1.bits.PllLock) 00290 pc.printf("PllLock "); 00291 if (RegIrqFlags1.bits.Rssi) 00292 pc.printf("Rssi "); 00293 if (RegIrqFlags1.bits.Timeout) 00294 pc.printf("Timeout "); 00295 if (RegIrqFlags1.bits.PreambleDetect) 00296 pc.printf("PreambleDetect "); 00297 if (RegIrqFlags1.bits.SyncAddressMatch) 00298 pc.printf("SyncAddressMatch "); 00299 00300 pc.printf(" | "); 00301 if (RegIrqFlags2.bits.FifoFull) 00302 pc.printf("FifoFull "); 00303 if (RegIrqFlags2.bits.FifoEmpty) 00304 pc.printf("FifoEmpty "); 00305 if (RegIrqFlags2.bits.FifoLevel) 00306 pc.printf("FifoLevel "); 00307 if (RegIrqFlags2.bits.FifoOverrun) 00308 pc.printf("FifoOverrun "); 00309 if (RegIrqFlags2.bits.PacketSent) 00310 pc.printf("PacketSent "); 00311 if (RegIrqFlags2.bits.PayloadReady) 00312 pc.printf("PayloadReady "); 00313 if (RegIrqFlags2.bits.CrcOk) 00314 pc.printf("CrcOk "); 00315 if (RegIrqFlags2.bits.LowBat) 00316 pc.printf("LowBat "); 00317 00318 prevRegIrqFlags1.octet = RegIrqFlags1.octet; 00319 prevRegIrqFlags2.octet = RegIrqFlags2.octet; 00320 00321 pc.printf("\e[K"); 00322 ret = true; 00323 } // ..if irq flag changed 00324 } // ..if (++cnt > X) 00325 } // ..!radio.RegOpMode.bits.LongRangeMode 00326 00327 return ret; 00328 } 00329 00330 void Radio::setFS() 00331 { 00332 radio.set_opmode(RF_OPMODE_SYNTHESIZER_RX); 00333 } 00334 00335 const menu_t* Radio::get_modem_sub_menu() 00336 { 00337 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); 00338 if (radio.RegOpMode.bits.LongRangeMode) { 00339 return NULL; 00340 } else { 00341 if (radio.RegOpMode.bits.ModulationType == 1) { 00342 fsk.RegOokPeak.octet = radio.read_reg(REG_FSK_OOKPEAK); 00343 if (fsk.RegOokPeak.bits.OokThreshType == 0) { 00344 return ook_fixed_menu; 00345 } else if (fsk.RegOokPeak.bits.OokThreshType == 1) { 00346 return ook_peak_menu; 00347 } else if (fsk.RegOokPeak.bits.OokThreshType == 2) { 00348 return ook_average_menu; 00349 } 00350 } else 00351 return NULL; 00352 } 00353 00354 return NULL; 00355 } 00356 00357 const menu_t* Radio::get_modem_menu() 00358 { 00359 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); 00360 00361 if (radio.RegOpMode.bits.LongRangeMode) { 00362 return lora_menu; 00363 } else { 00364 if (radio.RegOpMode.bits.ModulationType == 0) 00365 return fsk_menu; 00366 else { 00367 return ook_menu; 00368 } 00369 } 00370 } 00371 00372 void Radio::tx_payload_length_print() 00373 { 00374 pc.printf("%u", get_payload_length()); 00375 } 00376 00377 bool Radio::tx_payload_length_write(const char* txt) 00378 { 00379 unsigned len; 00380 00381 sscanf(txt, "%u", &len); 00382 //log_printf("scanned %u from \"%s\"\r\n", len, txt); 00383 00384 set_payload_length(len); 00385 00386 return false; 00387 } 00388 00389 const char* const Radio::opmode_status_strs[] = { 00390 "SLEEP ", // 0 00391 "STANDBY ", // 1 00392 "FS_TX ", // 2 00393 "TX ", // 3 00394 "FS_RX ", // 4 00395 "RX ", // 5 00396 "RX_SINGLE", // 6 00397 "CAD ", // 7 00398 NULL 00399 }; 00400 00401 const char* const Radio::opmode_select_strs[] = { 00402 "SLEEP ", // 0 00403 "STANDBY ", // 1 00404 "FS_TX ", // 2 00405 "TX ", // 3 00406 "FS_RX ", // 4 00407 "RX ", // 5 00408 "RX_SINGLE", // 6 00409 "CAD ", // 7 00410 NULL 00411 }; 00412 00413 unsigned Radio::opmode_read(bool forWriting) 00414 { 00415 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); 00416 return radio.RegOpMode.bits.Mode; 00417 } 00418 00419 menuMode_e Radio::opmode_write(unsigned sel) 00420 { 00421 radio.RegOpMode.bits.Mode = sel; 00422 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet); 00423 00424 return MENUMODE_REDRAW; 00425 } 00426 00427 void Radio::ocp_print(void) 00428 { 00429 unsigned i; 00430 00431 radio.RegOcp.octet = radio.read_reg(REG_OCP); 00432 if (radio.RegOcp.bits.OcpTrim < 16) 00433 i = 45 + (5 * radio.RegOcp.bits.OcpTrim); 00434 else if (radio.RegOcp.bits.OcpTrim < 28) 00435 i = (10 * radio.RegOcp.bits.OcpTrim) - 30; 00436 else 00437 i = 240; 00438 00439 pc.printf("%u", i); 00440 } 00441 00442 bool Radio::ocp_write(const char* txt) 00443 { 00444 unsigned i; 00445 00446 sscanf(txt, "%u", &i); 00447 00448 if (i < 130) 00449 radio.RegOcp.bits.OcpTrim = (i - 45) / 5; 00450 else 00451 radio.RegOcp.bits.OcpTrim = (i + 30) / 10; 00452 00453 radio.write_reg(REG_OCP, radio.RegOcp.octet); 00454 00455 return MENUMODE_REDRAW; 00456 } 00457 00458 const value_item_t Radio::ocp_item = { _ITEM_VALUE, 4, ocp_print, ocp_write}; 00459 00460 static const char* const lora_bws_1276[] = { 00461 " 7.8KHz", // 0 00462 " 10.4KHz", // 1 00463 " 15.6KHz", // 2 00464 " 20.8KHz", // 3 00465 "31.25KHz", // 4 00466 " 41.7KHz", // 5 00467 " 62.5KHz", // 6 00468 " 125KHz", // 7 00469 " 250KHz", // 8 00470 " 500KHz", // 9 00471 NULL 00472 }; 00473 static const char* const lora_bws_1272[] = { 00474 "125KHz", // 0 00475 "250KHz", // 1 00476 "500KHz", // 2 00477 NULL 00478 }; 00479 00480 unsigned Radio::lora_bw_read(bool fw) 00481 { 00482 bw_idx = lora.getBw(); 00483 return bw_idx; 00484 } 00485 00486 menuMode_e Radio::lora_bw_write(unsigned sidx) 00487 { 00488 lora.setBw(sidx); 00489 bw_idx = sidx; 00490 00491 return MENUMODE_REDRAW; 00492 } 00493 00494 dropdown_item_t Radio::lora_bw_item = { _ITEM_DROPDOWN, NULL, NULL, lora_bw_read, lora_bw_write}; 00495 00496 void Radio::lora_sf_print() 00497 { 00498 pc.printf("%u", lora.getSf()); 00499 } 00500 00501 bool Radio::lora_sf_write(const char* txt) 00502 { 00503 unsigned sf; 00504 00505 sscanf(txt, "%u", &sf); 00506 lora.setSf(sf); 00507 00508 return false; 00509 } 00510 00511 const value_item_t Radio::lora_sf_item = { _ITEM_VALUE, 3, lora_sf_print, lora_sf_write }; 00512 00513 const char* const lora_crs[] = { 00514 "4/5", // 0 00515 "4/6", // 1 00516 "4/7", // 2 00517 "4/8", // 3 00518 NULL 00519 }; 00520 00521 unsigned Radio::lora_cr_read(bool) 00522 { 00523 return lora.getCodingRate(false); 00524 } 00525 00526 menuMode_e Radio::lora_cr_write(unsigned sidx) 00527 { 00528 lora.setCodingRate(sidx); 00529 00530 return MENUMODE_REDRAW; 00531 } 00532 00533 const dropdown_item_t Radio::lora_cr_item = { _ITEM_DROPDOWN, lora_crs, lora_crs, lora_cr_read, lora_cr_write}; 00534 00535 void Radio::lora_pblLen_print() 00536 { 00537 lora.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB); 00538 pc.printf("%u", lora.RegPreamble); 00539 } 00540 00541 bool Radio::lora_pblLen_write(const char* str) 00542 { 00543 unsigned n; 00544 00545 sscanf(str, "%u", &n); 00546 00547 lora.RegPreamble = n; 00548 radio.write_u16(REG_LR_PREAMBLEMSB, lora.RegPreamble); 00549 00550 return false; 00551 } 00552 00553 const value_item_t Radio::lora_pblLen_item = { _ITEM_VALUE, 5, lora_pblLen_print, lora_pblLen_write}; 00554 00555 static const char* const lora_fixlen[] = { 00556 "EXPLICIT", // 0 00557 "IMPLICIT", // 1 00558 NULL 00559 }; 00560 00561 unsigned Radio::lora_fixlen_read(bool f) 00562 { 00563 if (lora.getHeaderMode()) 00564 return 1; 00565 else 00566 return 0; 00567 } 00568 00569 menuMode_e Radio::lora_fixlen_write(unsigned sidx) 00570 { 00571 lora.setHeaderMode(sidx == 1); // true = implicit 00572 00573 return MENUMODE_REDRAW; 00574 } 00575 00576 const dropdown_item_t Radio::lora_fixlen_item = { _ITEM_DROPDOWN, lora_fixlen, lora_fixlen, lora_fixlen_read, lora_fixlen_write}; 00577 00578 bool Radio::lora_crcon_read() 00579 { 00580 return lora.getRxPayloadCrcOn(); 00581 } 00582 00583 bool Radio::lora_crcon_push() 00584 { 00585 lora.setRxPayloadCrcOn(!lora.getRxPayloadCrcOn()); 00586 return lora.getRxPayloadCrcOn(); 00587 } 00588 00589 const toggle_item_t Radio::lora_crcon_item = { _ITEM_TOGGLE, "CrcOn", NULL, lora_crcon_read, lora_crcon_push}; 00590 00591 bool Radio::lora_iqinvTX_read() 00592 { 00593 lora.RegTest33.octet = radio.read_reg(REG_LR_TEST33); 00594 return !lora.RegTest33.bits.chirp_invert_tx; 00595 } 00596 00597 bool Radio::lora_iqinvTX_push() 00598 { 00599 lora.invert_tx(lora.RegTest33.bits.chirp_invert_tx); 00600 return !lora.RegTest33.bits.chirp_invert_tx; 00601 } 00602 00603 const toggle_item_t Radio::lora_iqinvTX_item = { _ITEM_TOGGLE, "iqInvTX", NULL, lora_iqinvTX_read, lora_iqinvTX_push}; 00604 00605 bool Radio::lora_iqinvRX_read() 00606 { 00607 lora.RegTest33.octet = radio.read_reg(REG_LR_TEST33); 00608 return lora.RegTest33.bits.invert_i_q; 00609 } 00610 00611 bool Radio::lora_iqinvRX_push() 00612 { 00613 lora.invert_rx(!lora.RegTest33.bits.invert_i_q); 00614 lora.RegTest33.octet = radio.read_reg(REG_LR_TEST33); 00615 return lora.RegTest33.bits.invert_i_q; 00616 } 00617 00618 const toggle_item_t Radio::lora_iqinvRX_item = { _ITEM_TOGGLE, "iqInvRX", NULL, lora_iqinvRX_read, lora_iqinvRX_push}; 00619 00620 void Radio::lora_ppg_print() 00621 { 00622 pc.printf("%02x", radio.read_reg(REG_LR_SYNC_BYTE)); 00623 } 00624 00625 bool Radio::lora_ppg_write(const char* str) 00626 { 00627 unsigned ppg; 00628 sscanf(str, "%x", &ppg); 00629 00630 radio.write_reg(REG_LR_SYNC_BYTE, ppg); 00631 00632 return false; 00633 } 00634 00635 const value_item_t Radio::lora_ppg_item = { _ITEM_VALUE, 4, lora_ppg_print, lora_ppg_write}; 00636 00637 void Radio::cadrx_push() 00638 { 00639 if (radio.RegDioMapping1.bits.Dio0Mapping != 2 || radio.RegDioMapping1.bits.Dio1Mapping != 2) { 00640 radio.RegDioMapping1.bits.Dio0Mapping = 2; // DIO0 to CadDone 00641 radio.RegDioMapping1.bits.Dio1Mapping = 2; // DIO1 to CadDetected 00642 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet); 00643 } 00644 00645 radio.set_opmode(RF_OPMODE_CAD); 00646 } 00647 00648 const button_item_t Radio::lora_cadrx_item = { _ITEM_BUTTON, "CADRX", cadrx_push }; 00649 00650 const menu_t Radio::lora_menu[] = { 00651 { {FIRST_CHIP_MENU_ROW, 22}, "bw:", &lora_bw_item, FLAG_MSGTYPE_ALL }, 00652 { {FIRST_CHIP_MENU_ROW, 35}, "sf:", &lora_sf_item, FLAG_MSGTYPE_ALL }, 00653 { {FIRST_CHIP_MENU_ROW, 42}, "cr:", &lora_cr_item, FLAG_MSGTYPE_ALL }, 00654 { {FIRST_CHIP_MENU_ROW, 50}, "PreambleLength:", &lora_pblLen_item, FLAG_MSGTYPE_ALL }, 00655 00656 { {FIRST_CHIP_MENU_ROW+1, 1}, NULL, &lora_fixlen_item, FLAG_MSGTYPE_ALL }, 00657 { {FIRST_CHIP_MENU_ROW+1, 10}, NULL, &lora_crcon_item, FLAG_MSGTYPE_ALL }, 00658 { {FIRST_CHIP_MENU_ROW+1, 20}, NULL, &lora_iqinvTX_item, FLAG_MSGTYPE_ALL }, 00659 { {FIRST_CHIP_MENU_ROW+1, 30}, NULL, &lora_iqinvRX_item, FLAG_MSGTYPE_ALL }, 00660 { {FIRST_CHIP_MENU_ROW+1, 40}, "ppg:", &lora_ppg_item, FLAG_MSGTYPE_ALL }, 00661 00662 { {FIRST_CHIP_MENU_ROW+2, 1}, NULL, &lora_cadrx_item, FLAG_MSGTYPE_ALL }, 00663 00664 { {0, 0}, NULL, NULL } 00665 }; 00666 00667 void Radio::fsk_ook_bps_print(void) 00668 { 00669 pc.printf("%lu", fsk.get_bitrate()); 00670 } 00671 00672 bool Radio::fsk_ook_bps_write(const char* txt) 00673 { 00674 unsigned bps; 00675 00676 sscanf(txt, "%u", &bps); 00677 fsk.set_bitrate(bps); 00678 00679 return false; 00680 } 00681 00682 const value_item_t Radio::fsk_ook_bitrate_item = { _ITEM_VALUE, 8, fsk_ook_bps_print, fsk_ook_bps_write }; 00683 00684 void Radio::gfsk_fdev_print(void) 00685 { 00686 pc.printf("%lu", fsk.get_tx_fdev_hz()); 00687 00688 } 00689 00690 bool Radio::gfsk_fdev_write(const char* txt) 00691 { 00692 unsigned hz; 00693 00694 sscanf(txt, "%u", &hz); 00695 00696 fsk.set_tx_fdev_hz(hz); 00697 00698 return false; 00699 } 00700 00701 const value_item_t Radio::gfsk_fdev_item = { _ITEM_VALUE, 8, gfsk_fdev_print, gfsk_fdev_write}; 00702 00703 const char* const gfsk_bts[] = { 00704 "off", // 0 00705 "1.0", // 1 00706 "0.5", // 2 00707 "0.3", // 3 00708 NULL 00709 }; 00710 00711 const char* const ook_bts[] = { 00712 "off ", // 0 00713 "bitRate ", // 1 00714 "2*bitRate", // 2 00715 NULL 00716 }; 00717 00718 unsigned Radio::bt_read(bool forWriting) 00719 { 00720 if (radio.type == SX1276) { 00721 RegPaRamp.octet = radio.read_reg(REG_PARAMP); 00722 return RegPaRamp.bits.ModulationShaping; 00723 } else if (radio.type == SX1272) { 00724 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); 00725 return radio.RegOpMode.bits.ModulationShaping; 00726 } 00727 return 3; 00728 } 00729 00730 menuMode_e Radio::bt_write(unsigned sel) 00731 { 00732 if (radio.type == SX1276) { 00733 RegPaRamp.bits.ModulationShaping = sel; 00734 radio.write_reg(REG_PARAMP, RegPaRamp.octet); 00735 } else if (radio.type == SX1272) { 00736 radio.RegOpMode.bits.ModulationShaping = sel; 00737 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet); 00738 } 00739 return MENUMODE_REDRAW; 00740 } 00741 00742 const dropdown_item_t Radio::gfsk_bt_item = { _ITEM_DROPDOWN, gfsk_bts, gfsk_bts, bt_read, bt_write}; 00743 const dropdown_item_t Radio::ook_bt_item = { _ITEM_DROPDOWN, ook_bts, ook_bts, bt_read, bt_write}; 00744 00745 bool Radio::paSelect_read() 00746 { 00747 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG); 00748 return radio.RegPaConfig.bits.PaSelect; 00749 } 00750 00751 bool Radio::paSelect_push() 00752 { 00753 radio.RegPaConfig.bits.PaSelect ^= 1; 00754 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet); 00755 return radio.RegPaConfig.bits.PaSelect; 00756 } 00757 00758 const toggle_item_t Radio::paSelect_item = { _ITEM_TOGGLE, 00759 "RFO ", // 0 00760 "PA_BOOST", // 1 00761 paSelect_read, paSelect_push 00762 }; 00763 00764 const char* const rxbws[] = { 00765 " 2.6", // 0 00766 " 3.1", // 1 00767 " 3.9", // 2 00768 " 5.2", // 3 00769 " 6.3", // 4 00770 " 7.8", // 5 00771 " 10.4", // 6 00772 " 12.5", // 7 00773 " 15.6", // 8 00774 " 20.8", // 9 00775 " 25.0", // 10 00776 " 31.3", // 11 00777 " 41.7", // 12 00778 " 50.0", // 13 00779 " 62.5", // 14 00780 " 83.3", // 15 00781 "100.0", // 16 00782 "125.0", // 17 00783 "166.7", // 18 00784 "200.0", // 19 00785 "250.0", // 20 00786 NULL 00787 }; 00788 00789 unsigned Radio::bw_read(uint8_t regAddr) 00790 { 00791 RegRxBw_t reg_bw; 00792 00793 reg_bw.octet = radio.read_reg(regAddr); 00794 00795 switch (reg_bw.bits.Exponent) { 00796 case 7: 00797 if (reg_bw.bits.Mantissa == 2) 00798 return 0; 00799 if (reg_bw.bits.Mantissa == 1) 00800 return 1; 00801 if (reg_bw.bits.Mantissa == 0) 00802 return 2; 00803 break; 00804 case 6: 00805 if (reg_bw.bits.Mantissa == 2) 00806 return 3; 00807 if (reg_bw.bits.Mantissa == 1) 00808 return 4; 00809 if (reg_bw.bits.Mantissa == 0) 00810 return 5; 00811 break; 00812 case 5: 00813 if (reg_bw.bits.Mantissa == 2) 00814 return 6; 00815 if (reg_bw.bits.Mantissa == 1) 00816 return 7; 00817 if (reg_bw.bits.Mantissa == 0) 00818 return 8; 00819 break; 00820 case 4: 00821 if (reg_bw.bits.Mantissa == 2) 00822 return 9; 00823 if (reg_bw.bits.Mantissa == 1) 00824 return 10; 00825 if (reg_bw.bits.Mantissa == 0) 00826 return 11; 00827 break; 00828 case 3: 00829 if (reg_bw.bits.Mantissa == 2) 00830 return 12; 00831 if (reg_bw.bits.Mantissa == 1) 00832 return 13; 00833 if (reg_bw.bits.Mantissa == 0) 00834 return 14; 00835 break; 00836 case 2: 00837 if (reg_bw.bits.Mantissa == 2) 00838 return 15; 00839 if (reg_bw.bits.Mantissa == 1) 00840 return 16; 00841 if (reg_bw.bits.Mantissa == 0) 00842 return 17; 00843 break; 00844 case 1: 00845 if (reg_bw.bits.Mantissa == 2) 00846 return 18; 00847 if (reg_bw.bits.Mantissa == 1) 00848 return 19; 00849 if (reg_bw.bits.Mantissa == 0) 00850 return 20; 00851 break; 00852 } 00853 00854 return 21; 00855 } 00856 00857 unsigned Radio::rxbw_read(bool) 00858 { 00859 return bw_read(REG_FSK_RXBW); 00860 } 00861 00862 unsigned Radio::afcbw_read(bool) 00863 { 00864 return bw_read(REG_FSK_AFCBW); 00865 } 00866 00867 void Radio::bw_write(unsigned sidx, uint8_t regAddr) 00868 { 00869 RegRxBw_t reg_bw; 00870 00871 reg_bw.octet = radio.read_reg(regAddr); 00872 00873 switch (sidx) { 00874 case 0: 00875 reg_bw.bits.Mantissa = 2; 00876 reg_bw.bits.Exponent = 7; 00877 break; 00878 case 1: 00879 reg_bw.bits.Mantissa = 1; 00880 reg_bw.bits.Exponent = 7; 00881 break; 00882 case 2: 00883 reg_bw.bits.Mantissa = 0; 00884 reg_bw.bits.Exponent = 7; 00885 break; 00886 case 3: 00887 reg_bw.bits.Mantissa = 2; 00888 reg_bw.bits.Exponent = 6; 00889 break; 00890 case 4: 00891 reg_bw.bits.Mantissa = 1; 00892 reg_bw.bits.Exponent = 6; 00893 break; 00894 case 5: 00895 reg_bw.bits.Mantissa = 0; 00896 reg_bw.bits.Exponent = 6; 00897 break; 00898 case 6: 00899 reg_bw.bits.Mantissa = 2; 00900 reg_bw.bits.Exponent = 5; 00901 break; 00902 case 7: 00903 reg_bw.bits.Mantissa = 1; 00904 reg_bw.bits.Exponent = 5; 00905 break; 00906 case 8: 00907 reg_bw.bits.Mantissa = 0; 00908 reg_bw.bits.Exponent = 5; 00909 break; 00910 case 9: 00911 reg_bw.bits.Mantissa = 2; 00912 reg_bw.bits.Exponent = 4; 00913 break; 00914 case 10: 00915 reg_bw.bits.Mantissa = 1; 00916 reg_bw.bits.Exponent = 4; 00917 break; 00918 case 11: 00919 reg_bw.bits.Mantissa = 0; 00920 reg_bw.bits.Exponent = 4; 00921 break; 00922 case 12: 00923 reg_bw.bits.Mantissa = 2; 00924 reg_bw.bits.Exponent = 3; 00925 break; 00926 case 13: 00927 reg_bw.bits.Mantissa = 1; 00928 reg_bw.bits.Exponent = 3; 00929 break; 00930 case 14: 00931 reg_bw.bits.Mantissa = 0; 00932 reg_bw.bits.Exponent = 3; 00933 break; 00934 case 15: 00935 reg_bw.bits.Mantissa = 2; 00936 reg_bw.bits.Exponent = 2; 00937 break; 00938 case 16: 00939 reg_bw.bits.Mantissa = 1; 00940 reg_bw.bits.Exponent = 2; 00941 break; 00942 case 17: 00943 reg_bw.bits.Mantissa = 0; 00944 reg_bw.bits.Exponent = 2; 00945 break; 00946 case 18: 00947 reg_bw.bits.Mantissa = 2; 00948 reg_bw.bits.Exponent = 1; 00949 break; 00950 case 19: 00951 reg_bw.bits.Mantissa = 1; 00952 reg_bw.bits.Exponent = 1; 00953 break; 00954 case 20: 00955 reg_bw.bits.Mantissa = 0; 00956 reg_bw.bits.Exponent = 1; 00957 break; 00958 } 00959 00960 radio.write_reg(regAddr, reg_bw.octet); 00961 } 00962 00963 menuMode_e Radio::rxbw_write(unsigned sidx) 00964 { 00965 bw_write(sidx, REG_FSK_RXBW); 00966 return MENUMODE_REDRAW; 00967 } 00968 00969 menuMode_e Radio::afcbw_write(unsigned sidx) 00970 { 00971 bw_write(sidx, REG_FSK_AFCBW); 00972 return MENUMODE_REDRAW; 00973 } 00974 00975 const dropdown_item_t Radio::rxbw_item = { _ITEM_DROPDOWN, rxbws, rxbws, rxbw_read, rxbw_write}; 00976 const dropdown_item_t Radio::afcbw_item = { _ITEM_DROPDOWN, rxbws, rxbws, afcbw_read, afcbw_write}; 00977 00978 void Radio::pblLen_print() 00979 { 00980 pc.printf("%u", radio.read_u16(REG_FSK_PREAMBLEMSB)); 00981 } 00982 00983 bool Radio::pblLen_write(const char* txt) 00984 { 00985 unsigned n; 00986 sscanf(txt, "%u", &n); 00987 radio.write_u16(REG_FSK_PREAMBLEMSB, n); 00988 return false; 00989 } 00990 00991 const value_item_t Radio::pblLen_item = { _ITEM_VALUE, 6, pblLen_print, pblLen_write}; 00992 00993 00994 const char* const rxTriggers[] = { 00995 "off ", // 0 00996 "RSSI ", // 1 00997 "Preamble ", // 2 00998 "RSSI+Preamble", // 3 00999 NULL 01000 }; 01001 01002 unsigned Radio::rxTrigger_read(bool fw) 01003 { 01004 fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG); 01005 return fsk.RegRxConfig.bits.RxTrigger; 01006 } 01007 01008 menuMode_e Radio::rxTrigger_write(unsigned sidx) 01009 { 01010 fsk.RegRxConfig.bits.RxTrigger = sidx; 01011 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet); 01012 return MENUMODE_REDRAW; 01013 } 01014 01015 const dropdown_item_t Radio::rxTrigger_item = { _ITEM_DROPDOWN, rxTriggers, rxTriggers, rxTrigger_read, rxTrigger_write}; 01016 01017 bool Radio::AgcAutoOn_read() 01018 { 01019 fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG); 01020 return fsk.RegRxConfig.bits.AgcAutoOn; 01021 } 01022 01023 bool Radio::AgcAutoOn_push() 01024 { 01025 fsk.RegRxConfig.bits.AgcAutoOn ^= 1; 01026 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet); 01027 return fsk.RegRxConfig.bits.AgcAutoOn; 01028 } 01029 01030 bool Radio::AfcAutoOn_read() 01031 { 01032 fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG); 01033 return fsk.RegRxConfig.bits.AfcAutoOn; 01034 } 01035 01036 bool Radio::AfcAutoOn_push() 01037 { 01038 fsk.RegRxConfig.bits.AfcAutoOn ^= 1; 01039 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet); 01040 return fsk.RegRxConfig.bits.AfcAutoOn; 01041 } 01042 01043 const toggle_item_t Radio::agcautoon_item = { _ITEM_TOGGLE, "AgcAutoOn", NULL, AgcAutoOn_read, AgcAutoOn_push}; 01044 01045 const toggle_item_t Radio::afcautoon_item = { _ITEM_TOGGLE, "AfcAutoOn", NULL, AfcAutoOn_read, AfcAutoOn_push}; 01046 01047 bool Radio::RestartRxOnCollision_read() 01048 { 01049 fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG); 01050 return fsk.RegRxConfig.bits.RestartRxOnCollision; 01051 } 01052 01053 bool Radio::RestartRxOnCollision_push() 01054 { 01055 fsk.RegRxConfig.bits.RestartRxOnCollision ^= 1; 01056 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet); 01057 return fsk.RegRxConfig.bits.RestartRxOnCollision; 01058 } 01059 01060 const toggle_item_t Radio::RestartRxOnCollision_item = { _ITEM_TOGGLE, 01061 "RestartRxOnCollision", NULL, 01062 RestartRxOnCollision_read, RestartRxOnCollision_push 01063 }; 01064 01065 void Radio::RestartRxWithPllLock_push() 01066 { 01067 fsk.RegRxConfig.bits.RestartRxWithPllLock = 1; 01068 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet); 01069 fsk.RegRxConfig.bits.RestartRxWithPllLock = 0; 01070 } 01071 01072 const button_item_t Radio::RestartRxWithPllLock_item = { _ITEM_BUTTON, 01073 "RestartRxWithPllLock", 01074 RestartRxWithPllLock_push 01075 }; 01076 01077 void Radio::RestartRxWithoutPllLock_push() 01078 { 01079 fsk.RegRxConfig.bits.RestartRxWithoutPllLock = 1; 01080 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet); 01081 fsk.RegRxConfig.bits.RestartRxWithoutPllLock = 0; 01082 } 01083 01084 const button_item_t Radio::RestartRxWithoutPllLock_item = { _ITEM_BUTTON, 01085 "RestartRxWithoutPllLock", 01086 RestartRxWithoutPllLock_push 01087 }; 01088 01089 bool Radio::AfcAutoClearOn_read(void) 01090 { 01091 fsk.RegAfcFei.octet = radio.read_reg(REG_FSK_AFCFEI); 01092 return fsk.RegAfcFei.bits.AfcAutoClearOn; 01093 } 01094 01095 bool Radio::AfcAutoClearOn_push(void) 01096 { 01097 fsk.RegAfcFei.bits.AfcAutoClearOn ^= 1; 01098 radio.write_reg(REG_FSK_AFCFEI, fsk.RegAfcFei.octet); 01099 return fsk.RegAfcFei.bits.AfcAutoClearOn; 01100 } 01101 01102 const toggle_item_t Radio::AfcAutoClearOn_item = { _ITEM_TOGGLE, "AfcAutoClearOn", NULL, AfcAutoClearOn_read, AfcAutoClearOn_push}; 01103 01104 void Radio::AgcStart_push() 01105 { 01106 fsk.RegAfcFei.bits.AgcStart = 1; 01107 radio.write_reg(REG_FSK_AFCFEI, fsk.RegAfcFei.octet); 01108 fsk.RegAfcFei.bits.AgcStart = 1; 01109 } 01110 01111 const button_item_t Radio::AgcStart_item = { _ITEM_BUTTON, "AgcStart", AgcStart_push}; 01112 01113 void Radio::AfcClear_push() 01114 { 01115 fsk.RegAfcFei.bits.AfcClear = 1; 01116 radio.write_reg(REG_FSK_AFCFEI, fsk.RegAfcFei.octet); 01117 fsk.RegAfcFei.bits.AfcClear = 0; 01118 } 01119 const button_item_t Radio::AfcClear_item = { _ITEM_BUTTON, "AfcClear", AfcClear_push}; 01120 01121 void Radio::syncWord_print(void) 01122 { 01123 unsigned n, stop; 01124 01125 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG); 01126 01127 stop = fsk.RegSyncConfig.bits.SyncSize + 1; 01128 for (n = 0; n < stop; n++) { 01129 pc.printf("%02x", radio.read_reg(REG_FSK_SYNCVALUE1+n)); 01130 } 01131 } 01132 01133 bool Radio::syncWord_write(const char* txt) 01134 { 01135 const char* ptr; 01136 const char* endPtr; 01137 unsigned o, n = 0; 01138 01139 endPtr = txt + strlen(txt); 01140 for (ptr = txt; sscanf(ptr, "%02x", &o) == 1; ) { 01141 radio.write_reg(REG_FSK_SYNCVALUE1+n, o); 01142 n++; 01143 ptr += 2; 01144 if (ptr >= endPtr) 01145 break; 01146 } 01147 01148 fsk.RegSyncConfig.bits.SyncSize = n - 1; 01149 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet); 01150 01151 return false; 01152 } 01153 01154 const value_item_t Radio::syncWord_item = { _ITEM_VALUE, 17, syncWord_print, syncWord_write}; 01155 01156 void Radio::syncSize_print(void) 01157 { 01158 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG); 01159 01160 pc.printf("%u", fsk.RegSyncConfig.bits.SyncSize + 1); 01161 } 01162 01163 bool Radio::syncSize_write(const char* txt) 01164 { 01165 unsigned n; 01166 sscanf(txt, "%u", &n); 01167 if (n > 0) { 01168 fsk.RegSyncConfig.bits.SyncSize = n - 1; 01169 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet); 01170 } 01171 return false; 01172 } 01173 01174 const value_item_t Radio::syncSize_item = { _ITEM_VALUE, 2, syncSize_print, syncSize_write}; 01175 01176 bool Radio::SyncOn_read() 01177 { 01178 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG); 01179 return fsk.RegSyncConfig.bits.SyncOn; 01180 } 01181 01182 bool Radio::SyncOn_push() 01183 { 01184 fsk.RegSyncConfig.bits.SyncOn ^= 1; 01185 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet); 01186 return fsk.RegSyncConfig.bits.SyncOn; 01187 } 01188 01189 const toggle_item_t Radio::syncOn_item = { _ITEM_TOGGLE, "SyncOn", NULL, SyncOn_read, SyncOn_push}; 01190 01191 bool Radio::fsk_pktfmt_read() 01192 { 01193 fsk.RegPktConfig1.octet = radio.read_reg(REG_FSK_PACKETCONFIG1); 01194 return fsk.RegPktConfig1.bits.PacketFormatVariable; 01195 } 01196 01197 bool Radio::fsk_pktfmt_push() 01198 { 01199 fsk.RegPktConfig1.bits.PacketFormatVariable ^= 1; 01200 radio.write_reg(REG_FSK_PACKETCONFIG1, fsk.RegPktConfig1.octet); 01201 return fsk.RegPktConfig1.bits.PacketFormatVariable; 01202 } 01203 01204 const toggle_item_t Radio::fskook_pktfmt_item = { _ITEM_TOGGLE, 01205 "fixed ", 01206 "variable", 01207 fsk_pktfmt_read, fsk_pktfmt_push 01208 }; 01209 01210 01211 void Radio::rssiOffset_print(void) 01212 { 01213 int ro; 01214 fsk.RegRssiConfig.octet = radio.read_reg(REG_FSK_RSSICONFIG); 01215 ro = fsk.RegRssiConfig.bits.RssiOffset; 01216 pc.printf("%d", ro); 01217 } 01218 01219 bool Radio::rssiOffset_write(const char* txt) 01220 { 01221 int ro; 01222 sscanf(txt, "%d", &ro); 01223 fsk.RegRssiConfig.bits.RssiOffset = ro; 01224 radio.write_reg(REG_FSK_RSSICONFIG, fsk.RegRssiConfig.octet); 01225 return false; 01226 } 01227 01228 const value_item_t Radio::rssiOffset_item = { _ITEM_VALUE, 2, rssiOffset_print, rssiOffset_write}; 01229 01230 const char* const rssiSmoothings[] = { 01231 "2 ", // 0 01232 "4 ", // 1 01233 "8 ", // 2 01234 "16 ", // 3 01235 "32 ", // 4 01236 "64 ", // 5 01237 "128", // 6 01238 "256", // 7 01239 NULL 01240 }; 01241 01242 unsigned Radio::rssiSmoothing_read(bool fw) 01243 { 01244 fsk.RegRssiConfig.octet = radio.read_reg(REG_FSK_RSSICONFIG); 01245 return fsk.RegRssiConfig.bits.RssiSmoothing; 01246 } 01247 01248 menuMode_e Radio::rssiSmoothing_write(unsigned sidx) 01249 { 01250 radio.write_reg(REG_FSK_RSSICONFIG, fsk.RegRssiConfig.octet); 01251 fsk.RegRssiConfig.bits.RssiSmoothing = sidx; 01252 return MENUMODE_REDRAW; 01253 } 01254 01255 const dropdown_item_t Radio::rssiSmoothing_item = { _ITEM_DROPDOWN, rssiSmoothings, rssiSmoothings, rssiSmoothing_read, rssiSmoothing_write}; 01256 01257 bool Radio::dataMode_read() 01258 { 01259 fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2); 01260 return fsk.RegPktConfig2.bits.DataModePacket; 01261 } 01262 01263 bool Radio::dataMode_push() 01264 { 01265 fsk.RegPktConfig2.bits.DataModePacket ^= 1; 01266 radio.write_u16(REG_FSK_PACKETCONFIG2, fsk.RegPktConfig2.word); 01267 return fsk.RegPktConfig2.bits.DataModePacket; 01268 } 01269 01270 const toggle_item_t Radio::dataMode_item = { _ITEM_TOGGLE, 01271 "continuous", 01272 "packet ", 01273 dataMode_read, dataMode_push 01274 }; 01275 01276 bool Radio::bitSyncOn_read(void) 01277 { 01278 fsk.RegOokPeak.octet = radio.read_reg(REG_FSK_OOKPEAK); 01279 return fsk.RegOokPeak.bits.BitSyncOn; 01280 } 01281 01282 bool Radio::bitSyncOn_push(void) 01283 { 01284 fsk.RegOokPeak.bits.BitSyncOn ^= 1; 01285 radio.write_reg(REG_FSK_OOKPEAK, fsk.RegOokPeak.octet); 01286 return fsk.RegOokPeak.bits.BitSyncOn; 01287 } 01288 01289 const toggle_item_t Radio::bitSyncOn_item = { _ITEM_TOGGLE, 01290 "BitSyncOn", NULL, 01291 bitSyncOn_read, bitSyncOn_push 01292 }; 01293 01294 const button_item_t Radio::pdLabel_item = { _ITEM_BUTTON, "PreambleDetector", NULL}; 01295 01296 bool Radio::pdOn_read(void) 01297 { 01298 fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT); 01299 return fsk.RegPreambleDetect.bits.PreambleDetectorOn; 01300 } 01301 01302 bool Radio::pdOn_push(void) 01303 { 01304 fsk.RegPreambleDetect.bits.PreambleDetectorOn ^= 1; 01305 radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet); 01306 return fsk.RegPreambleDetect.bits.PreambleDetectorOn; 01307 } 01308 01309 const toggle_item_t Radio::pdOn_item = { _ITEM_TOGGLE, 01310 "On", NULL, 01311 pdOn_read, pdOn_push 01312 }; 01313 01314 const char* const pdsizes[] = { 01315 "1 byte ", // 0 01316 "2 bytes", // 1 01317 "3 bytes", // 2 01318 NULL 01319 }; 01320 01321 unsigned Radio::pdSize_read(bool) 01322 { 01323 fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT); 01324 return fsk.RegPreambleDetect.bits.PreambleDetectorSize; 01325 } 01326 01327 menuMode_e Radio::pdSize_write(unsigned sidx) 01328 { 01329 fsk.RegPreambleDetect.bits.PreambleDetectorSize = sidx; 01330 radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet); 01331 return MENUMODE_REDRAW; 01332 } 01333 01334 const dropdown_item_t Radio::pdSize_item = { _ITEM_DROPDOWN, pdsizes, pdsizes, pdSize_read, pdSize_write}; 01335 01336 void Radio::pdTol_print(void) 01337 { 01338 fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT); 01339 pc.printf("%u", fsk.RegPreambleDetect.bits.PreambleDetectorTol); 01340 } 01341 01342 bool Radio::pdTol_write(const char* txt) 01343 { 01344 unsigned n; 01345 sscanf(txt, "%u", &n); 01346 fsk.RegPreambleDetect.bits.PreambleDetectorTol = n; 01347 radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet); 01348 return false; 01349 } 01350 01351 const value_item_t Radio::pdTol_item = { _ITEM_VALUE, 3, pdTol_print, pdTol_write}; 01352 01353 bool Radio::TxStartCondition_read() 01354 { 01355 fsk.RegFifoThreshold.octet = radio.read_reg(REG_FSK_FIFOTHRESH); 01356 return fsk.RegFifoThreshold.bits.TxStartCondition; 01357 } 01358 01359 bool Radio::TxStartCondition_push() 01360 { 01361 fsk.RegFifoThreshold.bits.TxStartCondition ^= 1; 01362 radio.write_reg(REG_FSK_FIFOTHRESH, fsk.RegFifoThreshold.octet); 01363 return fsk.RegFifoThreshold.bits.TxStartCondition; 01364 } 01365 01366 const toggle_item_t Radio::TxStartCondition_item = { _ITEM_TOGGLE, 01367 "FifoLevel ", // 0 01368 "FifoNotEmpty", // 1 01369 TxStartCondition_read, TxStartCondition_push 01370 }; 01371 01372 void Radio::FifoThreshold_print(void) 01373 { 01374 fsk.RegFifoThreshold.octet = radio.read_reg(REG_FSK_FIFOTHRESH); 01375 pc.printf("%u", fsk.RegFifoThreshold.bits.FifoThreshold); 01376 } 01377 01378 bool Radio::FifoThreshold_write(const char* txt) 01379 { 01380 unsigned n; 01381 sscanf(txt, "%u", &n); 01382 fsk.RegFifoThreshold.bits.FifoThreshold = n; 01383 radio.write_reg(REG_FSK_FIFOTHRESH, fsk.RegFifoThreshold.octet); 01384 return false; 01385 } 01386 01387 const value_item_t Radio::FifoThreshold_item = { _ITEM_VALUE, 3, FifoThreshold_print, FifoThreshold_write}; 01388 01389 const char* const dcFrees[] = { 01390 "none ", // 0 01391 "manchester", // 1 01392 "whitening ", // 2 01393 NULL 01394 }; 01395 01396 unsigned Radio::dcFree_read(bool fw) 01397 { 01398 fsk.RegPktConfig1.octet = radio.read_reg(REG_FSK_PACKETCONFIG1); 01399 return fsk.RegPktConfig1.bits.DcFree; 01400 } 01401 01402 menuMode_e Radio::dcFree_write(unsigned sidx) 01403 { 01404 fsk.RegPktConfig1.bits.DcFree = sidx; 01405 radio.write_reg(REG_FSK_PACKETCONFIG1, fsk.RegPktConfig1.octet); 01406 return MENUMODE_REDRAW; 01407 } 01408 01409 const dropdown_item_t Radio::dcFree_item = { _ITEM_DROPDOWN, dcFrees, dcFrees, dcFree_read, dcFree_write}; 01410 01411 bool Radio::fskook_crcon_read() 01412 { 01413 fsk.RegPktConfig1.octet = radio.read_reg(REG_FSK_PACKETCONFIG1); 01414 return fsk.RegPktConfig1.bits.CrcOn; 01415 } 01416 01417 bool Radio::fskook_crcon_push() 01418 { 01419 fsk.RegPktConfig1.bits.CrcOn ^= 1; 01420 radio.write_reg(REG_FSK_PACKETCONFIG1, fsk.RegPktConfig1.octet); 01421 01422 if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER) 01423 fsk.config_dio0_for_pktmode_rx(); 01424 01425 return fsk.RegPktConfig1.bits.CrcOn; 01426 } 01427 01428 const toggle_item_t Radio::fskook_crcon_item = { _ITEM_TOGGLE, 01429 "CrcOn", NULL, 01430 fskook_crcon_read, fskook_crcon_push 01431 }; 01432 01433 void Radio::rssiThresh_print() 01434 { 01435 fsk.RegRssiThresh = radio.read_reg(REG_FSK_RSSITHRESH); 01436 pc.printf("%.1f", fsk.RegRssiThresh / -2.0); 01437 } 01438 01439 bool Radio::rssiThresh_write(const char* txt) 01440 { 01441 float dbm; 01442 sscanf(txt, "%f", &dbm); 01443 fsk.RegRssiThresh = dbm * -2.0; 01444 radio.write_reg(REG_FSK_RSSITHRESH, fsk.RegRssiThresh); 01445 return false; 01446 } 01447 01448 const value_item_t Radio::rssiThresh_item = { _ITEM_VALUE, 3, rssiThresh_print, rssiThresh_write}; 01449 01450 bool Radio::pblPol_read() 01451 { 01452 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG); 01453 return fsk.RegSyncConfig.bits.PreamblePolarity; 01454 } 01455 01456 bool Radio::pblPol_push() 01457 { 01458 fsk.RegSyncConfig.bits.PreamblePolarity ^= 1; 01459 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet); 01460 return fsk.RegSyncConfig.bits.PreamblePolarity; 01461 } 01462 01463 const toggle_item_t Radio::pblPol_item = { _ITEM_TOGGLE, 01464 "0xaa", 01465 "0x55", 01466 pblPol_read, pblPol_push 01467 }; 01468 01469 const menu_t Radio::fsk_menu[] = { 01470 { {FIRST_CHIP_MENU_ROW, 22}, "bps:", &fsk_ook_bitrate_item, FLAG_MSGTYPE_ALL }, 01471 { {FIRST_CHIP_MENU_ROW, 34}, "fdev:", &gfsk_fdev_item, FLAG_MSGTYPE_ALL }, 01472 { {FIRST_CHIP_MENU_ROW, 47}, "BT:", &gfsk_bt_item, FLAG_MSGTYPE_ALL }, 01473 { {FIRST_CHIP_MENU_ROW, 57}, "length:", &fskook_pktfmt_item, FLAG_MSGTYPE_ALL }, 01474 01475 { {FIRST_CHIP_MENU_ROW+1, 1}, "rxbw:", &rxbw_item, FLAG_MSGTYPE_ALL }, 01476 { {FIRST_CHIP_MENU_ROW+1, 14}, "afcbw:", &afcbw_item, FLAG_MSGTYPE_ALL }, 01477 { {FIRST_CHIP_MENU_ROW+1, 27}, "preambleLen:", &pblLen_item, FLAG_MSGTYPE_ALL }, 01478 { {FIRST_CHIP_MENU_ROW+1, 47}, "RxTrigger:", &rxTrigger_item, FLAG_MSGTYPE_ALL }, 01479 { {FIRST_CHIP_MENU_ROW+1, 72}, NULL, &pblPol_item, FLAG_MSGTYPE_ALL }, 01480 01481 { {FIRST_CHIP_MENU_ROW+2, 1}, "syncWord:", &syncWord_item, FLAG_MSGTYPE_ALL, &syncSize_item}, 01482 { {FIRST_CHIP_MENU_ROW+2, 27}, "syncSize:", &syncSize_item, FLAG_MSGTYPE_ALL }, 01483 { {FIRST_CHIP_MENU_ROW+2, 39}, NULL, &syncOn_item, FLAG_MSGTYPE_ALL }, 01484 { {FIRST_CHIP_MENU_ROW+2, 47}, "DataMode:", &dataMode_item, FLAG_MSGTYPE_ALL }, 01485 { {FIRST_CHIP_MENU_ROW+2, 69}, NULL, &bitSyncOn_item, FLAG_MSGTYPE_ALL }, 01486 01487 { {FIRST_CHIP_MENU_ROW+3, 1}, NULL, &pdLabel_item, FLAG_MSGTYPE_ALL }, 01488 { {FIRST_CHIP_MENU_ROW+3, 18}, NULL, &pdOn_item, FLAG_MSGTYPE_ALL }, 01489 { {FIRST_CHIP_MENU_ROW+3, 23}, "size:", &pdSize_item , FLAG_MSGTYPE_ALL }, 01490 { {FIRST_CHIP_MENU_ROW+3, 36}, "tol:", &pdTol_item , FLAG_MSGTYPE_ALL }, 01491 { {FIRST_CHIP_MENU_ROW+3, 48}, "rssiThresh:", &rssiThresh_item , FLAG_MSGTYPE_ALL }, 01492 01493 { {FIRST_CHIP_MENU_ROW+4, 1}, NULL, &agcautoon_item, FLAG_MSGTYPE_ALL }, 01494 { {FIRST_CHIP_MENU_ROW+4, 11}, NULL, &afcautoon_item, FLAG_MSGTYPE_ALL }, 01495 { {FIRST_CHIP_MENU_ROW+4, 22}, NULL, &RestartRxOnCollision_item, FLAG_MSGTYPE_ALL }, 01496 { {FIRST_CHIP_MENU_ROW+4, 43}, NULL, &RestartRxWithPllLock_item, FLAG_MSGTYPE_ALL }, 01497 { {FIRST_CHIP_MENU_ROW+4, 64}, NULL, &RestartRxWithoutPllLock_item, FLAG_MSGTYPE_ALL }, 01498 01499 { {FIRST_CHIP_MENU_ROW+5, 1}, NULL, &AfcAutoClearOn_item, FLAG_MSGTYPE_ALL }, 01500 { {FIRST_CHIP_MENU_ROW+5, 17}, NULL, &AgcStart_item, FLAG_MSGTYPE_ALL }, 01501 { {FIRST_CHIP_MENU_ROW+5, 27}, NULL, &AfcClear_item, FLAG_MSGTYPE_ALL }, 01502 { {FIRST_CHIP_MENU_ROW+5, 37}, "rssiOffset:", &rssiOffset_item, FLAG_MSGTYPE_ALL }, 01503 { {FIRST_CHIP_MENU_ROW+5, 52}, "rssiSmoothing:", &rssiSmoothing_item, FLAG_MSGTYPE_ALL }, 01504 01505 { {FIRST_CHIP_MENU_ROW+6, 1}, "TxStartCondition:", &TxStartCondition_item, FLAG_MSGTYPE_ALL }, 01506 { {FIRST_CHIP_MENU_ROW+6, 32}, "FifoThreshold:", &FifoThreshold_item, FLAG_MSGTYPE_ALL }, 01507 { {FIRST_CHIP_MENU_ROW+6, 50}, "dcFree:", &dcFree_item, FLAG_MSGTYPE_ALL }, 01508 { {FIRST_CHIP_MENU_ROW+6, 68}, NULL, &fskook_crcon_item, FLAG_MSGTYPE_ALL }, 01509 01510 { {0, 0}, NULL, NULL } 01511 }; 01512 01513 const button_item_t Radio::ookLabel_item = { _ITEM_BUTTON, "Ook", NULL}; 01514 01515 const menu_t Radio::common_menu[] = { 01516 { {FIRST_CHIP_MENU_ROW, 1}, NULL, &paSelect_item, FLAG_MSGTYPE_ALL }, 01517 { {FIRST_CHIP_MENU_ROW, 10}, "ocp mA:", &ocp_item, FLAG_MSGTYPE_ALL }, 01518 { {0, 0}, NULL, NULL } 01519 }; 01520 01521 const char* const ook_peak_steps[] = { 01522 "0.5", // 0 01523 "1.0", // 1 01524 "1.5", // 2 01525 "2.0", // 3 01526 "3.0", // 4 01527 "4.0", // 5 01528 "5.0", // 6 01529 "6.0", // 7 01530 NULL 01531 }; 01532 01533 unsigned Radio::ook_peak_step_read(bool fw) 01534 { 01535 fsk.RegOokPeak.octet = radio.read_reg(REG_FSK_OOKPEAK); 01536 return fsk.RegOokPeak.bits.OokPeakThreshStep; 01537 } 01538 01539 menuMode_e Radio::ook_peak_step_write(unsigned sidx) 01540 { 01541 fsk.RegOokPeak.bits.OokPeakThreshStep = sidx; 01542 radio.write_reg(REG_FSK_OOKPEAK, fsk.RegOokPeak.octet); 01543 return MENUMODE_REDRAW; 01544 } 01545 01546 const dropdown_item_t Radio::ook_peak_step_item = { _ITEM_DROPDOWN, ook_peak_steps, ook_peak_steps, ook_peak_step_read, ook_peak_step_write}; 01547 01548 const char* const ook_peak_decs[] = { 01549 "once per chip ", // 0 01550 "once every 2 chips ", // 1 01551 "once every 4 chips ", // 2 01552 "once every 8 chips ", // 3 01553 "twice in each chip ", // 4 01554 "4 times in each chip ", // 5 01555 "8 times in each chip ", // 6 01556 "16 times in each chip", // 7 01557 NULL 01558 }; 01559 01560 unsigned Radio::ook_peak_dec_read(bool fw) 01561 { 01562 RegOokAvg_t RegOokAvg; 01563 RegOokAvg.octet = radio.read_reg(REG_FSK_OOKAVG); 01564 return RegOokAvg.bits.OokPeakThreshDec; 01565 } 01566 01567 menuMode_e Radio::ook_peak_dec_write(unsigned sidx) 01568 { 01569 RegOokAvg_t RegOokAvg; 01570 RegOokAvg.octet = radio.read_reg(REG_FSK_OOKAVG); 01571 RegOokAvg.bits.OokPeakThreshDec = sidx; 01572 radio.write_reg(REG_FSK_OOKAVG, RegOokAvg.octet); 01573 return MENUMODE_REDRAW; 01574 } 01575 01576 const dropdown_item_t Radio::ook_peak_dec_item = { _ITEM_DROPDOWN, ook_peak_decs, ook_peak_decs, ook_peak_dec_read, ook_peak_dec_write}; 01577 01578 void Radio::ookFixedThresh_print() 01579 { 01580 pc.printf("%u", radio.read_reg(REG_FSK_OOKFIX)); 01581 } 01582 01583 bool Radio::ookFixedThresh_write(const char* txt) 01584 { 01585 unsigned n; 01586 sscanf(txt, "%u", &n); 01587 radio.write_reg(REG_FSK_OOKFIX, n); 01588 return false; 01589 } 01590 01591 const value_item_t Radio::ookFixedThresh_item = { _ITEM_VALUE, 3, ookFixedThresh_print, ookFixedThresh_write}; 01592 01593 const char* const ook_avgOffsets[] = { 01594 "0.0dB", // 0 01595 "2.0dB", // 1 01596 "4.0dB", // 2 01597 "6.0dB", // 3 01598 NULL 01599 }; 01600 01601 unsigned Radio::ook_avgOffset_read(bool fw) 01602 { 01603 RegOokAvg_t RegOokAvg; 01604 RegOokAvg.octet = radio.read_reg(REG_FSK_OOKAVG); 01605 return RegOokAvg.bits.OokAverageOffset; 01606 } 01607 01608 menuMode_e Radio::ook_avgOffset_write(unsigned sidx) 01609 { 01610 RegOokAvg_t RegOokAvg; 01611 RegOokAvg.octet = radio.read_reg(REG_FSK_OOKAVG); 01612 RegOokAvg.bits.OokAverageOffset = sidx; 01613 radio.write_reg(REG_FSK_OOKAVG, RegOokAvg.octet); 01614 return MENUMODE_REDRAW; 01615 } 01616 01617 const dropdown_item_t Radio::ook_avgOffset_item = { _ITEM_DROPDOWN, ook_avgOffsets, ook_avgOffsets, ook_avgOffset_read, ook_avgOffset_write}; 01618 01619 const char* const ook_avgFilters[] = { 01620 "chip rate / 32.π", // 0 01621 "chip rate / 8.π ", // 1 01622 "chip rate / 4.π ", // 2 01623 "chip rate / 2.π ", // 3 01624 NULL 01625 }; 01626 01627 unsigned Radio::ook_avgFilter_read(bool fw) 01628 { 01629 RegOokAvg_t RegOokAvg; 01630 RegOokAvg.octet = radio.read_reg(REG_FSK_OOKAVG); 01631 return RegOokAvg.bits.OokAverageThreshFilt; 01632 } 01633 01634 menuMode_e Radio::ook_avgFilter_write(unsigned sidx) 01635 { 01636 RegOokAvg_t RegOokAvg; 01637 RegOokAvg.octet = radio.read_reg(REG_FSK_OOKAVG); 01638 RegOokAvg.bits.OokAverageThreshFilt = sidx; 01639 radio.write_reg(REG_FSK_OOKAVG, RegOokAvg.octet); 01640 return MENUMODE_REDRAW; 01641 } 01642 01643 const dropdown_item_t Radio::ook_avgFilter_item = { _ITEM_DROPDOWN, ook_avgFilters, ook_avgFilters, ook_avgFilter_read, ook_avgFilter_write}; 01644 01645 const char* const ookthreshs[] = { 01646 "fixed ", // 0 01647 "peak ", // 1 01648 "average", // 2 01649 NULL 01650 }; 01651 01652 01653 unsigned Radio::ookthreshtype_read(bool) 01654 { 01655 fsk.RegOokPeak.octet = radio.read_reg(REG_FSK_OOKPEAK); 01656 01657 return fsk.RegOokPeak.bits.OokThreshType; 01658 } 01659 01660 menuMode_e Radio::ookthreshtype_write(unsigned sidx) 01661 { 01662 fsk.RegOokPeak.bits.OokThreshType = sidx; 01663 radio.write_reg(REG_FSK_OOKPEAK, fsk.RegOokPeak.octet); 01664 01665 return MENUMODE_REINIT_MENU; 01666 } 01667 01668 const dropdown_item_t Radio::ookthreshtype_item = { _ITEM_DROPDOWN, ookthreshs, ookthreshs, ookthreshtype_read, ookthreshtype_write}; 01669 01670 const menu_t Radio::ook_menu[] = { 01671 { {FIRST_CHIP_MENU_ROW, 22}, "bps:", &fsk_ook_bitrate_item, FLAG_MSGTYPE_ALL }, 01672 { {FIRST_CHIP_MENU_ROW, 34}, "Fcutoff=", &ook_bt_item, FLAG_MSGTYPE_ALL }, 01673 { {FIRST_CHIP_MENU_ROW, 56}, "length:", &fskook_pktfmt_item, FLAG_MSGTYPE_ALL }, 01674 01675 { {FIRST_CHIP_MENU_ROW+1, 1}, "rxbw:", &rxbw_item, FLAG_MSGTYPE_ALL }, 01676 { {FIRST_CHIP_MENU_ROW+1, 12}, "afcbw:", &afcbw_item, FLAG_MSGTYPE_ALL }, 01677 { {FIRST_CHIP_MENU_ROW+1, 25}, "preambleLen:", &pblLen_item, FLAG_MSGTYPE_ALL }, 01678 { {FIRST_CHIP_MENU_ROW+1, 47}, "RxTrigger:", &rxTrigger_item, FLAG_MSGTYPE_ALL }, 01679 01680 { {FIRST_CHIP_MENU_ROW+2, 1}, "syncWord:", &syncWord_item, FLAG_MSGTYPE_ALL, &syncSize_item}, 01681 { {FIRST_CHIP_MENU_ROW+2, 27}, "syncSize:", &syncSize_item, FLAG_MSGTYPE_ALL }, 01682 { {FIRST_CHIP_MENU_ROW+2, 39}, NULL, &syncOn_item, FLAG_MSGTYPE_ALL }, 01683 { {FIRST_CHIP_MENU_ROW+2, 47}, "DataMode:", &dataMode_item, FLAG_MSGTYPE_ALL }, 01684 { {FIRST_CHIP_MENU_ROW+2, 69}, NULL, &bitSyncOn_item, FLAG_MSGTYPE_ALL }, 01685 01686 { {FIRST_CHIP_MENU_ROW+3, 1}, NULL, &pdLabel_item, FLAG_MSGTYPE_ALL }, 01687 { {FIRST_CHIP_MENU_ROW+3, 18}, NULL, &pdOn_item, FLAG_MSGTYPE_ALL }, 01688 { {FIRST_CHIP_MENU_ROW+3, 23}, "size:", &pdSize_item , FLAG_MSGTYPE_ALL }, 01689 { {FIRST_CHIP_MENU_ROW+3, 36}, "tol:", &pdTol_item , FLAG_MSGTYPE_ALL }, 01690 { {FIRST_CHIP_MENU_ROW+3, 48}, "rssiThresh:", &rssiThresh_item , FLAG_MSGTYPE_ALL }, 01691 01692 { {FIRST_CHIP_MENU_ROW+4, 1}, "TxStartCondition:", &TxStartCondition_item, FLAG_MSGTYPE_ALL }, 01693 { {FIRST_CHIP_MENU_ROW+4, 32}, "FifoThreshold:", &FifoThreshold_item, FLAG_MSGTYPE_ALL }, 01694 { {FIRST_CHIP_MENU_ROW+4, 50}, "dcFree:", &dcFree_item, FLAG_MSGTYPE_ALL }, 01695 { {FIRST_CHIP_MENU_ROW+4, 68}, NULL, &fskook_crcon_item, FLAG_MSGTYPE_ALL }, 01696 01697 { {FIRST_CHIP_MENU_ROW+5, 1}, NULL, &ookLabel_item, FLAG_MSGTYPE_ALL }, 01698 { {FIRST_CHIP_MENU_ROW+5, 5}, "threshType:", &ookthreshtype_item, FLAG_MSGTYPE_ALL }, 01699 01700 { {0, 0}, NULL, NULL } 01701 }; 01702 01703 const menu_t Radio::ook_fixed_menu[] = { 01704 { {FIRST_CHIP_MENU_ROW+5, 25}, "threshold:", &ookFixedThresh_item, FLAG_MSGTYPE_ALL }, 01705 { {0, 0}, NULL, NULL } 01706 }; 01707 01708 const menu_t Radio::ook_peak_menu[] = { 01709 { {FIRST_CHIP_MENU_ROW+5, 25}, "step:", &ook_peak_step_item, FLAG_MSGTYPE_ALL }, 01710 { {FIRST_CHIP_MENU_ROW+5, 40}, "dec:", &ook_peak_dec_item, FLAG_MSGTYPE_ALL }, 01711 { {0, 0}, NULL, NULL } 01712 }; 01713 01714 const menu_t Radio::ook_average_menu[] = { 01715 { {FIRST_CHIP_MENU_ROW+5, 25}, "offset:", &ook_avgOffset_item, FLAG_MSGTYPE_ALL }, 01716 { {FIRST_CHIP_MENU_ROW+5, 45}, "filter:", &ook_avgFilter_item, FLAG_MSGTYPE_ALL }, 01717 { {0, 0}, NULL, NULL } 01718 }; 01719 01720 void Radio::boardInit(const RadioEvents_t* e) 01721 { 01722 targetInit(); 01723 01724 RadioEvents = e; 01725 01726 RegPaRamp.octet = radio.read_reg(REG_PARAMP); 01727 01728 if (radio.type == SX1276) { 01729 lora_bw_item.printed_strs = lora_bws_1276; 01730 lora_bw_item.selectable_strs = lora_bws_1276; 01731 } else if (radio.type == SX1272) { 01732 lora_bw_item.printed_strs = lora_bws_1272; 01733 lora_bw_item.selectable_strs = lora_bws_1272; 01734 } 01735 01736 lpt.start(); 01737 } 01738 01739 unsigned Radio::read_register(unsigned addr) 01740 { 01741 return radio.read_reg(addr); 01742 } 01743 01744 void Radio::write_register(unsigned addr, unsigned val) 01745 { 01746 radio.write_reg(addr, val); 01747 } 01748 01749 void Radio::test() { } 01750 01751 #endif /* ..SX127x_H */ 01752
Generated on Tue Jul 12 2022 16:29:49 by 1.7.2