static void increase_channel() { if (current_channel_id.channel_header.ch_freq_band == PHY_BAND_433) { if (current_channel_id.channel_header.ch_class == PHY_CLASS_LO_RATE) { current_channel_id.center_freq_index = (current_channel_id.center_freq_index == 68) ? 0 : current_channel_id.center_freq_index + 1; } else { current_channel_id.center_freq_index = (current_channel_id.center_freq_index == 56) ? 0 : current_channel_id.center_freq_index + 8; } }else if (current_channel_id.channel_header.ch_freq_band == PHY_BAND_868) { if (current_channel_id.channel_header.ch_class == PHY_CLASS_LO_RATE) { current_channel_id.center_freq_index = (current_channel_id.center_freq_index == 279) ? 0 : current_channel_id.center_freq_index + 1; } else { current_channel_id.center_freq_index = (current_channel_id.center_freq_index == 272) ? 0 : current_channel_id.center_freq_index + 8; } } #ifdef PLATFORM_EZR32LG_WSTK6200A char str[20]; channel_id_to_string(¤t_channel_id, str, sizeof(str)); console_print(str); lcd_write_line(6, str); #endif }
static void packet_received(hw_radio_packet_t* packet) { uint16_t crc = __builtin_bswap16(crc_calculate(packet->data, packet->length - 2)); if(memcmp(&crc, packet->data + packet->length + 1 - 2, 2) != 0) { DPRINT("CRC error"); missed_packets_counter++; } else { #if HW_NUM_LEDS > 0 led_toggle(0); #endif uint16_t msg_counter = 0; uint64_t msg_id; memcpy(&msg_id, packet->data + 1, sizeof(msg_id)); memcpy(&msg_counter, packet->data + 1 + sizeof(msg_id), sizeof(msg_counter)); char chan[8]; channel_id_to_string(&(packet->rx_meta.rx_cfg.channel_id), chan, sizeof(chan)); console_printf("%7s,%i,%i,%lu,%lu,%i\n", chan, msg_counter, packet->rx_meta.rssi, (unsigned long)msg_id, (unsigned long)id, packet->rx_meta.timestamp); if(counter == 0) { // just start, assume received all previous counters to reset PER to 0% received_packets_counter = msg_counter - 1; counter = msg_counter - 1; } uint16_t expected_counter = counter + 1; if(msg_counter == expected_counter) { received_packets_counter++; counter++; } else if(msg_counter > expected_counter) { missed_packets_counter += msg_counter - expected_counter; counter = msg_counter; } else { sched_post_task(&start); } double per = 0; if(msg_counter > 0) per = 100.0 - ((double)received_packets_counter / (double)msg_counter) * 100.0; sprintf(lcd_msg, "%i %i", (int)per, packet->rx_meta.rssi); #ifdef PLATFORM_EFM32GG_STK3700 lcd_write_string(lcd_msg); #else lcd_write_line(4, lcd_msg); #endif } }
// TODO code duplication with noise_test, refactor later static void process_command_chan() { while(fifo_get_size(&uart_rx_fifo) < COMMAND_CHAN_PARAM_SIZE); char param[COMMAND_CHAN_PARAM_SIZE]; fifo_pop(&uart_rx_fifo, param, COMMAND_CHAN_PARAM_SIZE); channel_id_t new_channel; if(strncmp(param, "433", 3) == 0) new_channel.channel_header.ch_freq_band = PHY_BAND_433; else if(strncmp(param, "868", 3) == 0) new_channel.channel_header.ch_freq_band = PHY_BAND_868; else if(strncmp(param, "915", 3) == 0) new_channel.channel_header.ch_freq_band = PHY_BAND_915; else goto error; char channel_class = param[3]; if(channel_class == 'L') new_channel.channel_header.ch_class = PHY_CLASS_LO_RATE; else if(channel_class == 'N') new_channel.channel_header.ch_class = PHY_CLASS_NORMAL_RATE; else if(channel_class == 'H') new_channel.channel_header.ch_class = PHY_CLASS_HI_RATE; else goto error; uint16_t center_freq_index = atoi((const char*)(param + 5)); new_channel.center_freq_index = center_freq_index; // validate if(new_channel.channel_header.ch_freq_band == PHY_BAND_433) { if(new_channel.channel_header.ch_class == PHY_CLASS_NORMAL_RATE && (new_channel.center_freq_index % 8 != 0 || new_channel.center_freq_index > 56)) goto error; else if(new_channel.channel_header.ch_class == PHY_CLASS_LO_RATE && new_channel.center_freq_index > 68) goto error; else if(new_channel.channel_header.ch_class == PHY_CLASS_HI_RATE) goto error; } // TODO validate PHY_BAND_868 // valid band, apply ... current_channel_id = new_channel; char str[20]; channel_id_to_string(¤t_channel_id, str, sizeof(str)); uart_transmit_string(str); // change channel and restart // TODOsched_post_task(&start_rx); return; error: uart_transmit_string("Error parsing CHAN command. Expected format example: '433L001'\n"); fifo_clear(&uart_rx_fifo); }
void start_rx() { log_print_string("start RX"); #ifdef HAS_LCD char channel_str[10] = ""; channel_id_to_string(&rx_cfg.channel_id, channel_str, sizeof(channel_str)); lcd_write_string(channel_str); #endif hw_radio_set_rx(&rx_cfg, NULL, &rssi_valid); }
void bootstrap() { DPRINT("Device booted at time: %d\n", timer_get_counter_value()); #ifndef FRAMEWORK_LOG_BINARY console_print("\r\nPER TEST - commands:\r\n"); console_print(" CHANfffriii channel settings:\r\n"); console_print(" fff frequency : 433, 868, 915\r\n"); console_print(" r rate : L(ow) N(ormal) H(igh)\r\n"); console_print(" iii center_freq_index\r\n"); console_print(" TRANsss transmit a packet every sss seconds.\r\n"); console_print(" RECV receive packets\r\n"); console_print(" RSET reset module\r\n"); #endif id = hw_get_unique_id(); hw_radio_init(&alloc_new_packet, &release_packet); rx_cfg.channel_id = current_channel_id; tx_cfg.channel_id = current_channel_id; ubutton_register_callback(0, &userbutton_callback); ubutton_register_callback(1, &userbutton_callback); fifo_init(&uart_rx_fifo, uart_rx_buffer, sizeof(uart_rx_buffer)); console_set_rx_interrupt_callback(&uart_rx_cb); console_rx_interrupt_enable(); sched_register_task(&start_rx); sched_register_task(&transmit_packet); sched_register_task(&start); sched_register_task(&process_uart_rx_fifo); current_state = STATE_CONFIG_DIRECTION; sched_post_task(&start); sched_post_task(&process_uart_rx_fifo); #ifdef PLATFORM_EFM32GG_STK3700 #else char str[20]; channel_id_to_string(¤t_channel_id, str, sizeof(str)); lcd_write_line(6, str); #endif timer_post_task(&transmit_packet, TIMER_TICKS_PER_SEC * 1); }
void read_rssi() { timestamped_rssi_t rssi_measurement; rssi_measurement.tick = timer_get_counter_value(); char rssi_samples_str[5 * RSSI_SAMPLES_PER_MEASUREMENT] = ""; int16_t max_rssi_sample = -200; for(int i = 0; i < RSSI_SAMPLES_PER_MEASUREMENT; i++) { rssi_measurement.rssi[i] = hw_radio_get_rssi(); if(rssi_measurement.rssi[i] > max_rssi_sample) max_rssi_sample = rssi_measurement.rssi[i]; sprintf(rssi_samples_str + (i * 5), ",%04i", rssi_measurement.rssi[i]); // TODO delay? } char str[80]; char channel_str[8] = ""; channel_id_to_string(&rx_cfg.channel_id, channel_str, sizeof(channel_str)); lcd_write_string(channel_str); sprintf(str, "%7s,%i%s\n", channel_str, rssi_measurement.tick, rssi_samples_str); console_print(str); #ifdef PLATFORM_EFM32GG_STK3700 //lcd_all_on(); lcd_write_number(max_rssi_sample); #elif defined HAS_LCD sprintf(str, "%7s,%d\n", channel_str, max_rssi_sample); lcd_write_string(str); #endif if(!use_manual_channel_switching) { switch_next_channel(); sched_post_task(&start_rx); } else { sched_post_task(&process_uart_rx_fifo); // check for UART commands first uint16_t delay = rand() % 5000; timer_post_task_delay(&read_rssi, delay); } hw_watchdog_feed(); }