int16_t hw_radio_get_rssi() { ezradio_cmd_reply_t ezradioReply; ezradio_get_modem_status(0, &ezradioReply); DPRINT("CURR_RSSI %d %d", convert_rssi(ezradioReply.GET_MODEM_STATUS.CURR_RSSI), ezradioReply.GET_MODEM_STATUS.CURR_RSSI); //DPRINT("LATCH_RSSI %d %d", convert_rssi(ezradioReply.GET_MODEM_STATUS.LATCH_RSSI), ezradioReply.GET_MODEM_STATUS.LATCH_RSSI); //DPRINT("ANT1_RSSI %d", convert_rssi(ezradioReply.GET_MODEM_STATUS.ANT1_RSSI)); //DPRINT("ANT2_RSSI %d", convert_rssi(ezradioReply.GET_MODEM_STATUS.ANT2_RSSI)); int16_t rss = convert_rssi(ezradioReply.GET_MODEM_STATUS.CURR_RSSI); return rss; }
int16_t hw_radio_get_latched_rssi() { ezradio_cmd_reply_t ezradioReply; //ezradio_get_modem_status(0, &ezradioReply); //return convert_rssi(ezradioReply.GET_MODEM_STATUS.LATCH_RSSI); ezradio_frr_d_read(1, &ezradioReply); return convert_rssi(ezradioReply.FRR_D_READ.FRR_D_VALUE); }
int16_t hw_radio_get_rssi() { ezradio_cmd_reply_t ezradioReply; ezradio_get_modem_status(0, &ezradioReply); //return -120; // DPRINT("CURR_RSSI %d", convert_rssi(ezradioReply.GET_MODEM_STATUS.CURR_RSSI)); // DPRINT("LATCH_RSSI %d", convert_rssi(ezradioReply.GET_MODEM_STATUS.LATCH_RSSI)); // DPRINT("ANT1_RSSI %d", convert_rssi(ezradioReply.GET_MODEM_STATUS.ANT1_RSSI)); // DPRINT("ANT2_RSSI %d", convert_rssi(ezradioReply.GET_MODEM_STATUS.ANT2_RSSI)); // ezradio_frr_d_read(1, &ezradioReply); // DPRINT("FRR_D_VALUE %d", convert_rssi(ezradioReply.FRR_D_READ.FRR_D_VALUE)); uint8_t rss = ezradioReply.GET_MODEM_STATUS.CURR_RSSI > ezradioReply.GET_MODEM_STATUS.LATCH_RSSI ? ezradioReply.GET_MODEM_STATUS.CURR_RSSI : ezradioReply.GET_MODEM_STATUS.LATCH_RSSI; return convert_rssi(rss); }
int16_t hw_radio_get_rssi() { return convert_rssi(cc1101_interface_read_single_reg(RSSI)); }
static void end_of_packet_isr() { cc1101_interface_set_interrupts_enabled(false); DPRINT("end of packet ISR"); switch(current_state) { case HW_RADIO_STATE_RX: ; uint8_t packet_len = cc1101_interface_read_single_reg(RXFIFO); DPRINT("EOP ISR packetLength: %d", packet_len); if(packet_len >= 63) { // long packets not yet supported or bit error in length byte, don't assert but flush rx DPRINT("Packet size too big, flushing RX"); uint8_t status = (cc1101_interface_strobe(RF_SNOP) & 0xF0); if(status == 0x60) { // RX overflow cc1101_interface_strobe(RF_SFRX); } else if(status == 0x10) { // still in RX, switch to idle first cc1101_interface_strobe(RF_SIDLE); } while(cc1101_interface_strobe(RF_SNOP) != 0x0F); // wait until in idle state cc1101_interface_strobe(RF_SRX); while(cc1101_interface_strobe(RF_SNOP) != 0x1F); // wait until in RX state cc1101_interface_set_interrupts_enabled(true); return; } hw_radio_packet_t* packet = alloc_packet_callback(packet_len); packet->length = packet_len; cc1101_interface_read_burst_reg(RXFIFO, packet->data + 1, packet->length); // fill rx_meta packet->rx_meta.rssi = convert_rssi(cc1101_interface_read_single_reg(RXFIFO)); packet->rx_meta.lqi = cc1101_interface_read_single_reg(RXFIFO) & 0x7F; memcpy(&(packet->rx_meta.rx_cfg.channel_id), ¤t_channel_id, sizeof(channel_id_t)); packet->rx_meta.crc_status = HW_CRC_UNAVAILABLE; // TODO packet->rx_meta.timestamp = timer_get_counter_value(); #ifdef FRAMEWORK_LOG_ENABLED log_print_raw_phy_packet(packet, false); #endif rx_packet_callback(packet); if(current_state == HW_RADIO_STATE_RX) // check still in RX, could be modified by upper layer while in callback { uint8_t status = (cc1101_interface_strobe(RF_SNOP) & 0xF0); if(status == 0x60) // RX overflow { cc1101_interface_strobe(RF_SFRX); while(cc1101_interface_strobe(RF_SNOP) != 0x0F); // wait until in idle state cc1101_interface_strobe(RF_SRX); while(cc1101_interface_strobe(RF_SNOP) != 0x1F); // wait until in RX state } cc1101_interface_set_interrupts_enabled(true); assert(cc1101_interface_strobe(RF_SNOP) == 0x1F); // expect to be in RX mode } break; case HW_RADIO_STATE_TX: if(!should_rx_after_tx_completed) switch_to_idle_mode(); current_packet->tx_meta.timestamp = timer_get_counter_value(); #ifdef FRAMEWORK_LOG_ENABLED log_print_raw_phy_packet(current_packet, true); #endif if(tx_packet_callback != 0) tx_packet_callback(current_packet); if(should_rx_after_tx_completed) { // RX requested while still in TX ... // TODO this could probably be further optimized by not going into IDLE // after RX by setting TXOFF_MODE to RX (if the cfg is the same at least) should_rx_after_tx_completed = false; start_rx(&pending_rx_cfg); } break; default: assert(false); } }