test sending sensor results over lora radio. Accelerometer and temp/pressure.

Dependencies:   SX127x

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers radio_sx127x.cpp Source File

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