mirror of
				https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
				synced 2025-11-03 22:31:04 +00:00 
			
		
		
		
	Fix global ID random
This commit is contained in:
		
							parent
							
								
									baab9a9c89
								
							
						
					
					
						commit
						236ac52925
					
				@ -156,7 +156,6 @@ static void __attribute__((unused)) ASSAN_initialize_txid()
 | 
				
			|||||||
	// Alternate frequency has some random
 | 
						// Alternate frequency has some random
 | 
				
			||||||
	do
 | 
						do
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		randomSeed((uint32_t)analogRead(A6) << 10 | analogRead(A7));
 | 
					 | 
				
			||||||
		freq2=random(0xfefefefe)%9;
 | 
							freq2=random(0xfefefefe)%9;
 | 
				
			||||||
		freq2+=freq*2-5;
 | 
							freq2+=freq*2-5;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -303,10 +303,7 @@ uint16_t ReadFrSkyX()
 | 
				
			|||||||
uint16_t initFrSkyX()
 | 
					uint16_t initFrSkyX()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	while(!chanskip)
 | 
						while(!chanskip)
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		randomSeed((uint32_t)analogRead(A6) << 10 | analogRead(A7));
 | 
					 | 
				
			||||||
		chanskip=random(0xfefefefe)%47;
 | 
							chanskip=random(0xfefefefe)%47;
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	while((chanskip-ctr)%4)
 | 
						while((chanskip-ctr)%4)
 | 
				
			||||||
		ctr=(ctr+1)%4;
 | 
							ctr=(ctr+1)%4;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
				
			|||||||
@ -345,7 +345,6 @@ uint16_t initHubsan() {
 | 
				
			|||||||
	const uint8_t allowed_ch[] = {0x14, 0x1e, 0x28, 0x32, 0x3c, 0x46, 0x50, 0x5a, 0x64, 0x6e, 0x78, 0x82};
 | 
						const uint8_t allowed_ch[] = {0x14, 0x1e, 0x28, 0x32, 0x3c, 0x46, 0x50, 0x5a, 0x64, 0x6e, 0x78, 0x82};
 | 
				
			||||||
	A7105_Init(INIT_HUBSAN);	//hubsan_init();
 | 
						A7105_Init(INIT_HUBSAN);	//hubsan_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	randomSeed((uint32_t)analogRead(A6) << 10 | analogRead(A7));
 | 
					 | 
				
			||||||
	sessionid = random(0xfefefefe) + ((uint32_t)random(0xfefefefe) << 16);
 | 
						sessionid = random(0xfefefefe) + ((uint32_t)random(0xfefefefe) << 16);
 | 
				
			||||||
	channel = allowed_ch[random(0xfefefefe) % sizeof(allowed_ch)];
 | 
						channel = allowed_ch[random(0xfefefefe) % sizeof(allowed_ch)];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -95,10 +95,15 @@ uint8_t protocol_flags=0,protocol_flags2=0;
 | 
				
			|||||||
// PPM variable
 | 
					// PPM variable
 | 
				
			||||||
volatile uint16_t PPM_data[NUM_CHN];
 | 
					volatile uint16_t PPM_data[NUM_CHN];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//Random variable
 | 
				
			||||||
 | 
					volatile uint32_t gWDT_entropy=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Serial variables
 | 
					// Serial variables
 | 
				
			||||||
#ifdef INVERT_TELEMETRY
 | 
					#ifdef INVERT_TELEMETRY
 | 
				
			||||||
// enable bit bash for serial
 | 
					// enable bit bash for serial
 | 
				
			||||||
 | 
						#ifndef XMEGA
 | 
				
			||||||
		#define	BASH_SERIAL 1
 | 
							#define	BASH_SERIAL 1
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
	#define	INVERT_SERIAL 1
 | 
						#define	INVERT_SERIAL 1
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#define BAUD 100000
 | 
					#define BAUD 100000
 | 
				
			||||||
@ -179,6 +184,7 @@ void setup()
 | 
				
			|||||||
		TCCR1A = 0;
 | 
							TCCR1A = 0;
 | 
				
			||||||
		TCCR1B = (1 << CS11);	//prescaler8, set timer1 to increment every 0.5us(16Mhz) and start timer
 | 
							TCCR1B = (1 << CS11);	//prescaler8, set timer1 to increment every 0.5us(16Mhz) and start timer
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
 | 
						random_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Set Chip selects
 | 
						// Set Chip selects
 | 
				
			||||||
	A7105_CS_on;
 | 
						A7105_CS_on;
 | 
				
			||||||
@ -216,12 +222,15 @@ void setup()
 | 
				
			|||||||
	LED_OFF;
 | 
						LED_OFF;
 | 
				
			||||||
	LED_SET_OUTPUT; 
 | 
						LED_SET_OUTPUT; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Read or create protocol id
 | 
					 | 
				
			||||||
	MProtocol_id_master=random_id(10,false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	//Init RF modules
 | 
						//Init RF modules
 | 
				
			||||||
	modules_reset();
 | 
						modules_reset();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//Init the seed with a random value created from watchdog timer for all protocols requiring random values
 | 
				
			||||||
 | 
						randomSeed(random_value());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Read or create protocol id
 | 
				
			||||||
 | 
						MProtocol_id_master=random_id(10,false);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
#ifdef ENABLE_PPM
 | 
					#ifdef ENABLE_PPM
 | 
				
			||||||
	//Protocol and interrupts initialization
 | 
						//Protocol and interrupts initialization
 | 
				
			||||||
	if(mode_select != MODE_SERIAL)
 | 
						if(mode_select != MODE_SERIAL)
 | 
				
			||||||
@ -856,20 +865,34 @@ static void set_rx_tx_addr(uint32_t id)
 | 
				
			|||||||
	rx_tx_addr[4] = 0xC1;	// for YD717: always uses first data port
 | 
						rx_tx_addr[4] = 0xC1;	// for YD717: always uses first data port
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void random_init(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						cli();					// Temporarily turn off interrupts, until WDT configured
 | 
				
			||||||
 | 
						MCUSR = 0;				// Use the MCU status register to reset flags for WDR, BOR, EXTR, and POWR
 | 
				
			||||||
 | 
						WDTCSR |= _BV(WDCE);	// WDT control register, This sets the Watchdog Change Enable (WDCE) flag, which is  needed to set the prescaler
 | 
				
			||||||
 | 
						WDTCSR = _BV(WDIE);		// Watchdog interrupt enable (WDIE)
 | 
				
			||||||
 | 
						sei();					// Turn interupts on
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32_t random_value(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						while (!gWDT_entropy);
 | 
				
			||||||
 | 
						return gWDT_entropy;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static uint32_t random_id(uint16_t adress, uint8_t create_new)
 | 
					static uint32_t random_id(uint16_t adress, uint8_t create_new)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint32_t id;
 | 
						uint32_t id;
 | 
				
			||||||
	uint8_t txid[4];
 | 
						uint8_t txid[4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (eeprom_read_byte((uint8_t*)(adress+10))==0xf0 && !create_new)
 | 
						if(eeprom_read_byte((uint8_t*)(adress+10))==0xf0 && !create_new)
 | 
				
			||||||
	{  // TXID exists in EEPROM
 | 
						{  // TXID exists in EEPROM
 | 
				
			||||||
		eeprom_read_block((void*)txid,(const void*)adress,4);
 | 
							eeprom_read_block((void*)txid,(const void*)adress,4);
 | 
				
			||||||
		id=(txid[0] | ((uint32_t)txid[1]<<8) | ((uint32_t)txid[2]<<16) | ((uint32_t)txid[3]<<24));
 | 
							id=(txid[0] | ((uint32_t)txid[1]<<8) | ((uint32_t)txid[2]<<16) | ((uint32_t)txid[3]<<24));
 | 
				
			||||||
 | 
							if(id!=0x2AD141A7)	//ID with seed=0
 | 
				
			||||||
 | 
								return id;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else
 | 
						// Generate a random ID
 | 
				
			||||||
	{ // if not generate a random ID
 | 
					 | 
				
			||||||
		randomSeed((uint32_t)analogRead(A6)<<10|analogRead(A7));//seed
 | 
					 | 
				
			||||||
		//
 | 
					 | 
				
			||||||
	id = random(0xfefefefe) + ((uint32_t)random(0xfefefefe) << 16);
 | 
						id = random(0xfefefefe) + ((uint32_t)random(0xfefefefe) << 16);
 | 
				
			||||||
	txid[0]=  (id &0xFF);
 | 
						txid[0]=  (id &0xFF);
 | 
				
			||||||
	txid[1] = ((id >> 8) & 0xFF);
 | 
						txid[1] = ((id >> 8) & 0xFF);
 | 
				
			||||||
@ -877,7 +900,6 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new)
 | 
				
			|||||||
	txid[3] = ((id >> 24) & 0xFF);
 | 
						txid[3] = ((id >> 24) & 0xFF);
 | 
				
			||||||
	eeprom_write_block((const void*)txid,(void*)adress,4);
 | 
						eeprom_write_block((const void*)txid,(void*)adress,4);
 | 
				
			||||||
	eeprom_write_byte((uint8_t*)(adress+10),0xf0);//write bind flag in eeprom.
 | 
						eeprom_write_byte((uint8_t*)(adress+10),0xf0);//write bind flag in eeprom.
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return id;
 | 
						return id;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1157,3 +1179,28 @@ ISR(TIMER1_COMPB_vect, ISR_NOBLOCK )
 | 
				
			|||||||
	tx_resume();
 | 
						tx_resume();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif //ENABLE_SERIAL
 | 
					#endif //ENABLE_SERIAL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Random interrupt service routine called every time the WDT interrupt is triggered.
 | 
				
			||||||
 | 
					// It is only enabled at startup to generate a seed.
 | 
				
			||||||
 | 
					ISR(WDT_vect)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						static uint8_t gWDT_buffer_position=0;
 | 
				
			||||||
 | 
						#define gWDT_buffer_SIZE 32
 | 
				
			||||||
 | 
						static uint8_t gWDT_buffer[gWDT_buffer_SIZE];
 | 
				
			||||||
 | 
						gWDT_buffer[gWDT_buffer_position] = TCNT1L; // Record the Timer 1 low byte (only one needed) 
 | 
				
			||||||
 | 
						gWDT_buffer_position++;                     // every time the WDT interrupt is triggered
 | 
				
			||||||
 | 
						if (gWDT_buffer_position >= gWDT_buffer_SIZE)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// The following code is an implementation of Jenkin's one at a time hash
 | 
				
			||||||
 | 
							for(uint8_t gWDT_loop_counter = 0; gWDT_loop_counter < gWDT_buffer_SIZE; ++gWDT_loop_counter)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								gWDT_entropy += gWDT_buffer[gWDT_loop_counter];
 | 
				
			||||||
 | 
								gWDT_entropy += (gWDT_entropy << 10);
 | 
				
			||||||
 | 
								gWDT_entropy ^= (gWDT_entropy >> 6);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							gWDT_entropy += (gWDT_entropy << 3);
 | 
				
			||||||
 | 
							gWDT_entropy ^= (gWDT_entropy >> 11);
 | 
				
			||||||
 | 
							gWDT_entropy += (gWDT_entropy << 15);
 | 
				
			||||||
 | 
							WDTCSR = 0;	// Disable Watchdog interrupt
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user