Improved channel access behaviour. Improved LoRa PHY parameter setup. Added parameter reporting to host connection.
This commit is contained in:
		
							parent
							
								
									2bf23fe810
								
							
						
					
					
						commit
						d45f03b433
					
				
							
								
								
									
										36
									
								
								Config.h
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								Config.h
									
									
									
									
									
								
							| @ -289,17 +289,24 @@ | ||||
| 
 | ||||
| 	// MCU independent configuration parameters
 | ||||
| 	const long serial_baudrate  = 115200; | ||||
| 	const int lora_rx_turnaround_ms = 50; | ||||
| 	uint8_t csma_p = 0; | ||||
| 	float csma_p_min = 0.1; | ||||
| 	float csma_p_max = 0.8; | ||||
| 	int csma_slot_ms = lora_rx_turnaround_ms; | ||||
| 
 | ||||
| 	// SX1276 RSSI offset to get dBm value from
 | ||||
| 	// packet RSSI register
 | ||||
| 	const int  rssi_offset = 157; | ||||
| 
 | ||||
| 	// Default LoRa settings
 | ||||
| 	const int lora_rx_turnaround_ms = 66; | ||||
| 	const int lora_post_tx_yield_slots = 6; | ||||
| 	uint32_t post_tx_yield_timeout = 0; | ||||
| 	#define LORA_PREAMBLE_SYMBOLS_HW  4 | ||||
| 	#define LORA_PREAMBLE_SYMBOLS_MIN 6 | ||||
| 	#define LORA_PREAMBLE_TARGET_MS   15 | ||||
| 	#define LORA_CAD_SYMBOLS 3 | ||||
| 	int csma_slot_ms = 50; | ||||
| 	float csma_p_min = 0.1; | ||||
| 	float csma_p_max = 0.8; | ||||
| 	uint8_t csma_p = 0; | ||||
| 
 | ||||
| 	int  lora_sf   	           = 0; | ||||
| 	int  lora_cr               = 5; | ||||
| 	int  lora_txp              = 0xFF; | ||||
| @ -370,18 +377,19 @@ | ||||
| 	float lt_airtime_limit = 0.0; | ||||
| 	bool airtime_lock = false; | ||||
| 
 | ||||
| 	bool stat_signal_detected = false; | ||||
| 	bool stat_signal_synced   = false; | ||||
| 	bool stat_rx_ongoing      = false; | ||||
| 	bool dcd                  = false; | ||||
| 	bool dcd_led              = false; | ||||
| 	bool dcd_waiting          = false; | ||||
| 	long dcd_wait_until       = 0; | ||||
| 	uint16_t dcd_count        = 0; | ||||
| 	uint16_t dcd_threshold    = 6; | ||||
| 	bool stat_signal_detected   = false; | ||||
| 	bool stat_signal_synced     = false; | ||||
| 	bool stat_rx_ongoing        = false; | ||||
| 	bool dcd                    = false; | ||||
| 	bool dcd_led                = false; | ||||
| 	bool dcd_waiting            = false; | ||||
| 	long dcd_wait_until         = 0; | ||||
| 	uint16_t dcd_count          = 0; | ||||
| 	uint16_t dcd_threshold      = 2; | ||||
| 
 | ||||
| 	uint32_t status_interval_ms = STATUS_INTERVAL_MS; | ||||
| 	uint32_t last_status_update = 0; | ||||
| 	uint32_t last_dcd = 0; | ||||
| 
 | ||||
| 	// Status flags
 | ||||
| 	const uint8_t SIG_DETECT = 0x01; | ||||
|  | ||||
| @ -43,6 +43,7 @@ | ||||
|   #define CMD_STAT_RSSI   0x23 | ||||
|   #define CMD_STAT_SNR    0x24 | ||||
|   #define CMD_STAT_CHTM   0x25 | ||||
|   #define CMD_STAT_PHYPRM 0x26 | ||||
|   #define CMD_BLINK       0x30 | ||||
|   #define CMD_RANDOM      0x40 | ||||
| 
 | ||||
|  | ||||
| @ -318,7 +318,6 @@ bool startRadio() { | ||||
|         setBandwidth(); | ||||
|         setSpreadingFactor(); | ||||
|         setCodingRate(); | ||||
|         setPreamble(); | ||||
|         getFrequency(); | ||||
| 
 | ||||
|         LoRa.enableCrc(); | ||||
| @ -398,6 +397,7 @@ void flushQueue(void) { | ||||
| 
 | ||||
|     lora_receive(); | ||||
|     led_tx_off(); | ||||
|     post_tx_yield_timeout = millis()+(lora_post_tx_yield_slots*csma_slot_ms); | ||||
|   } | ||||
| 
 | ||||
|   queue_height = 0; | ||||
| @ -925,20 +925,30 @@ void updateModemStatus() { | ||||
|   if (status & RX_ONGOING == RX_ONGOING) { stat_rx_ongoing = true; } else { stat_rx_ongoing = false; } | ||||
| 
 | ||||
|   if (stat_signal_detected || stat_signal_synced || stat_rx_ongoing) { | ||||
|     if (dcd_count < dcd_threshold) { | ||||
|       dcd_count++; | ||||
|       dcd = true; | ||||
|     } else { | ||||
|       dcd = true; | ||||
|       dcd_led = true; | ||||
|     if (stat_rx_ongoing) { | ||||
|       if (dcd_count < dcd_threshold) { | ||||
|         dcd_count++; | ||||
|       } else { | ||||
|         last_dcd = last_status_update; | ||||
|         dcd_led = true; | ||||
|         dcd = true; | ||||
|       } | ||||
|     } | ||||
|   } else { | ||||
|     if (dcd_count > 0) { | ||||
|       dcd_count = 0; | ||||
|     } else { | ||||
|     #define DCD_LED_STEP_D 3 | ||||
|     if (dcd_count == 0) { | ||||
|       dcd_led = false; | ||||
|     } else if (dcd_count > DCD_LED_STEP_D) { | ||||
|       dcd_count -= DCD_LED_STEP_D; | ||||
|     } else { | ||||
|       dcd_count = 0; | ||||
|     } | ||||
| 
 | ||||
|     if (last_status_update > last_dcd+csma_slot_ms) { | ||||
|       dcd = false; | ||||
|       dcd_led = false; | ||||
|       dcd_count = 0; | ||||
|     } | ||||
|     dcd = false; | ||||
|   } | ||||
| 
 | ||||
|   if (dcd_led) { | ||||
| @ -1110,8 +1120,6 @@ void validate_status() { | ||||
| 
 | ||||
| void loop() { | ||||
|   if (radio_online) { | ||||
|     checkModemStatus(); | ||||
| 
 | ||||
|     #if MCU_VARIANT == MCU_ESP32 | ||||
|       if (packet_ready) { | ||||
|         portENTER_CRITICAL(&update_lock); | ||||
| @ -1128,22 +1136,26 @@ void loop() { | ||||
|       if (lt_airtime_limit != 0.0 && longterm_airtime >= lt_airtime_limit) airtime_lock = true; | ||||
|     #endif | ||||
| 
 | ||||
|     checkModemStatus(); | ||||
|     if (!airtime_lock) { | ||||
|       if (queue_height > 0) { | ||||
|         #if MCU_VARIANT == MCU_ESP32 | ||||
|           long check_time = millis(); | ||||
|           if (check_time > post_tx_yield_timeout) { | ||||
|             if (dcd_waiting && (check_time >= dcd_wait_until)) { dcd_waiting = false; } | ||||
|             if (!dcd_waiting) { | ||||
|               for (uint8_t dcd_i = 0; dcd_i < dcd_threshold*2; dcd_i++) { | ||||
|                 delay(STATUS_INTERVAL_MS); updateModemStatus(); | ||||
|               } | ||||
| 
 | ||||
|           if (dcd_waiting && (millis() >= dcd_wait_until)) { dcd_waiting = false; } | ||||
|           if (!dcd_waiting) { | ||||
|             updateModemStatus(); | ||||
|             long check_time = millis(); | ||||
| 
 | ||||
|             if (!dcd) { | ||||
|               uint8_t csma_r = (uint8_t)random(256); | ||||
|               if (csma_p >= csma_r) { | ||||
|                 flushQueue(); | ||||
|               } else { | ||||
|                 dcd_waiting = true; | ||||
|                 dcd_wait_until = check_time+csma_slot_ms; | ||||
|               if (!dcd) { | ||||
|                 uint8_t csma_r = (uint8_t)random(256); | ||||
|                 if (csma_p >= csma_r) { | ||||
|                   flushQueue(); | ||||
|                 } else { | ||||
|                   dcd_waiting = true; | ||||
|                   dcd_wait_until = millis()+csma_slot_ms; | ||||
|                 } | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|  | ||||
							
								
								
									
										43
									
								
								Utilities.h
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								Utilities.h
									
									
									
									
									
								
							| @ -732,6 +732,29 @@ void kiss_indicate_channel_stats() { | ||||
| 	#endif | ||||
| } | ||||
| 
 | ||||
| void kiss_indicate_phy_stats() { | ||||
| 	#if MCU_VARIANT == MCU_ESP32 | ||||
| 		uint16_t lst = (uint16_t)(lora_symbol_time_ms*1000); | ||||
| 		uint16_t lsr = (uint16_t)(lora_symbol_rate); | ||||
| 		uint16_t prs = (uint16_t)(lora_preamble_symbols+4); | ||||
| 		uint16_t prt = (uint16_t)((lora_preamble_symbols+4)*lora_symbol_time_ms); | ||||
| 		uint16_t cst = (uint16_t)(csma_slot_ms); | ||||
| 		serial_write(FEND); | ||||
| 		serial_write(CMD_STAT_PHYPRM); | ||||
| 		escaped_serial_write(lst>>8); | ||||
| 		escaped_serial_write(lst); | ||||
| 		escaped_serial_write(lsr>>8); | ||||
| 		escaped_serial_write(lsr); | ||||
| 		escaped_serial_write(prs>>8); | ||||
| 		escaped_serial_write(prs); | ||||
| 		escaped_serial_write(prt>>8); | ||||
| 		escaped_serial_write(prt); | ||||
| 		escaped_serial_write(cst>>8); | ||||
| 		escaped_serial_write(cst); | ||||
| 		serial_write(FEND); | ||||
| 	#endif | ||||
| } | ||||
| 
 | ||||
| void kiss_indicate_btpin() { | ||||
| 	#if HAS_BLUETOOTH | ||||
| 		serial_write(FEND); | ||||
| @ -905,6 +928,11 @@ inline uint8_t packetSequence(uint8_t header) { | ||||
| 	return header >> 4; | ||||
| } | ||||
| 
 | ||||
| void setPreamble() { | ||||
| 	if (radio_online) LoRa.setPreambleLength(lora_preamble_symbols); | ||||
| 	kiss_indicate_phy_stats(); | ||||
| } | ||||
| 
 | ||||
| void updateBitrate() { | ||||
| 	#if MCU_VARIANT == MCU_ESP32 | ||||
| 		if (radio_online) { | ||||
| @ -912,7 +940,15 @@ void updateBitrate() { | ||||
| 			lora_symbol_time_ms = (1.0/lora_symbol_rate)*1000.0; | ||||
| 			lora_bitrate = (uint32_t)(lora_sf * ( (4.0/(float)lora_cr) / ((float)(pow(2, lora_sf))/((float)lora_bw/1000.0)) ) * 1000.0); | ||||
| 			lora_us_per_byte = 1000000.0/((float)lora_bitrate/8.0); | ||||
| 			csma_slot_ms = lora_symbol_time_ms*10; | ||||
| 			// csma_slot_ms = lora_symbol_time_ms*10;
 | ||||
| 			float target_preamble_symbols = (LORA_PREAMBLE_TARGET_MS/lora_symbol_time_ms)-LORA_PREAMBLE_SYMBOLS_HW; | ||||
| 			if (target_preamble_symbols < LORA_PREAMBLE_SYMBOLS_MIN) { | ||||
| 				target_preamble_symbols = LORA_PREAMBLE_SYMBOLS_MIN; | ||||
| 			} else { | ||||
| 				target_preamble_symbols = ceil(target_preamble_symbols); | ||||
| 			} | ||||
| 			lora_preamble_symbols = (long)target_preamble_symbols; | ||||
| 			setPreamble(); | ||||
| 		} else { | ||||
| 			lora_bitrate = 0; | ||||
| 		} | ||||
| @ -929,11 +965,6 @@ void setCodingRate() { | ||||
| 	updateBitrate(); | ||||
| } | ||||
| 
 | ||||
| void setPreamble() { | ||||
| 	if (radio_online) LoRa.setPreambleLength(lora_preamble_symbols); | ||||
| 	updateBitrate(); | ||||
| } | ||||
| 
 | ||||
| void set_implicit_length(uint8_t len) { | ||||
| 	implicit_l = len; | ||||
| 	if (implicit_l != 0) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user