mirror of
				https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
				synced 2025-11-04 06:51:03 +00:00 
			
		
		
		
	added Mike Blandord modifications
- used bootloader to flash multi-module with TX -updated FrslyX protocol telemetry sequence
This commit is contained in:
		
							parent
							
								
									021577d638
								
							
						
					
					
						commit
						2753f6c4e5
					
				@ -21,8 +21,11 @@
 | 
				
			|||||||
#include "iface_cc2500.h"
 | 
					#include "iface_cc2500.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint8_t chanskip;
 | 
					uint8_t chanskip;
 | 
				
			||||||
uint8_t seq_last_sent;
 | 
					//uint8_t seq_last_sent;
 | 
				
			||||||
uint8_t seq_last_rcvd;
 | 
					//uint8_t seq_last_rcvd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint8_t FrX_send_seq ;
 | 
				
			||||||
 | 
					uint8_t FrX_receive_seq ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __attribute__((unused)) set_start(uint8_t ch )
 | 
					static void __attribute__((unused)) set_start(uint8_t ch )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -151,13 +154,7 @@ static void __attribute__((unused)) frskyX_data_frame()
 | 
				
			|||||||
		packet[9+i+2]=chan_1>>4;
 | 
							packet[9+i+2]=chan_1>>4;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	packet[21] = seq_last_sent << 4 | seq_last_rcvd;//8 at start
 | 
						packet[21] = (FrX_receive_seq << 4) | FrX_send_seq ;//8 at start
 | 
				
			||||||
	if (seq_last_sent < 0x08 && seq_last_rcvd < 8)
 | 
					 | 
				
			||||||
		seq_last_sent = (seq_last_sent + 1) % 4;
 | 
					 | 
				
			||||||
	else if (seq_last_rcvd == 0x00)
 | 
					 | 
				
			||||||
		seq_last_sent = 1;
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		seq_last_rcvd = 8;
 | 
					 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if(sub_protocol & 1 )// in X8 mode send only 8ch every 9ms
 | 
						if(sub_protocol & 1 )// in X8 mode send only 8ch every 9ms
 | 
				
			||||||
		lpass = 0 ;
 | 
							lpass = 0 ;
 | 
				
			||||||
@ -210,7 +207,7 @@ uint16_t ReadFrSkyX()
 | 
				
			|||||||
			CC2500_Strobe(CC2500_SIDLE);		
 | 
								CC2500_Strobe(CC2500_SIDLE);		
 | 
				
			||||||
			CC2500_WriteData(packet, packet[0]+1);
 | 
								CC2500_WriteData(packet, packet[0]+1);
 | 
				
			||||||
			//
 | 
								//
 | 
				
			||||||
			frskyX_data_frame();
 | 
					//			frskyX_data_frame();
 | 
				
			||||||
			state++;
 | 
								state++;
 | 
				
			||||||
			return 5500;
 | 
								return 5500;
 | 
				
			||||||
		case FRSKY_DATA2:
 | 
							case FRSKY_DATA2:
 | 
				
			||||||
@ -221,7 +218,7 @@ uint16_t ReadFrSkyX()
 | 
				
			|||||||
		case FRSKY_DATA3:		
 | 
							case FRSKY_DATA3:		
 | 
				
			||||||
			CC2500_Strobe(CC2500_SRX);
 | 
								CC2500_Strobe(CC2500_SRX);
 | 
				
			||||||
			state++;
 | 
								state++;
 | 
				
			||||||
			return 3000;
 | 
								return 2800;
 | 
				
			||||||
		case FRSKY_DATA4:
 | 
							case FRSKY_DATA4:
 | 
				
			||||||
			len = CC2500_ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;	
 | 
								len = CC2500_ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;	
 | 
				
			||||||
			if (len && (len<=(0x0E + 3)))				//Telemetry frame is 17
 | 
								if (len && (len<=(0x0E + 3)))				//Telemetry frame is 17
 | 
				
			||||||
@ -240,8 +237,10 @@ uint16_t ReadFrSkyX()
 | 
				
			|||||||
				// restart sequence on missed packet - might need count or timeout instead of one missed
 | 
									// restart sequence on missed packet - might need count or timeout instead of one missed
 | 
				
			||||||
				if(packet_count>100)
 | 
									if(packet_count>100)
 | 
				
			||||||
				{//~1sec
 | 
									{//~1sec
 | 
				
			||||||
					seq_last_sent = 0;
 | 
					//					seq_last_sent = 0;
 | 
				
			||||||
					seq_last_rcvd = 8;
 | 
					//					seq_last_rcvd = 8;
 | 
				
			||||||
 | 
										FrX_send_seq = 0x08 ;
 | 
				
			||||||
 | 
										FrX_receive_seq = 0 ;
 | 
				
			||||||
					packet_count=0;
 | 
										packet_count=0;
 | 
				
			||||||
					#if defined TELEMETRY
 | 
										#if defined TELEMETRY
 | 
				
			||||||
						telemetry_lost=1;
 | 
											telemetry_lost=1;
 | 
				
			||||||
@ -249,8 +248,13 @@ uint16_t ReadFrSkyX()
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
				CC2500_Strobe(CC2500_SFRX);			//flush the RXFIFO
 | 
									CC2500_Strobe(CC2500_SFRX);			//flush the RXFIFO
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								frskyX_data_frame();
 | 
				
			||||||
 | 
								if ( FrX_send_seq != 0x08 )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									FrX_send_seq = ( FrX_send_seq + 1 ) & 0x03 ;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			state = FRSKY_DATA1;
 | 
								state = FRSKY_DATA1;
 | 
				
			||||||
			return 300;
 | 
								return 500;
 | 
				
			||||||
	}		
 | 
						}		
 | 
				
			||||||
	return 1;		
 | 
						return 1;		
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -279,8 +283,10 @@ uint16_t initFrSkyX()
 | 
				
			|||||||
		state = FRSKY_DATA1;
 | 
							state = FRSKY_DATA1;
 | 
				
			||||||
		initialize_data(0);
 | 
							initialize_data(0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	seq_last_sent = 0;
 | 
					//	seq_last_sent = 0;
 | 
				
			||||||
	seq_last_rcvd = 8;
 | 
					//	seq_last_rcvd = 8;
 | 
				
			||||||
 | 
						uint8_t FrX_send_seq = 0x08 ;
 | 
				
			||||||
 | 
						uint8_t FrX_receive_seq = 0 ;
 | 
				
			||||||
	return 10000;
 | 
						return 10000;
 | 
				
			||||||
}	
 | 
					}	
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@ -393,7 +393,7 @@ enum CC2500_POWER
 | 
				
			|||||||
	CC2500_POWER_16 = 0xFE,	//   0dbm
 | 
						CC2500_POWER_16 = 0xFE,	//   0dbm
 | 
				
			||||||
	CC2500_POWER_17 = 0xFF	//  +1dbm
 | 
						CC2500_POWER_17 = 0xFF	//  +1dbm
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#define CC2500_HIGH_POWER	CC2500_POWER_16
 | 
					#define CC2500_HIGH_POWER	CC2500_POWER_17
 | 
				
			||||||
#define CC2500_LOW_POWER	CC2500_POWER_13
 | 
					#define CC2500_LOW_POWER	CC2500_POWER_13
 | 
				
			||||||
#define CC2500_RANGE_POWER	CC2500_POWER_1
 | 
					#define CC2500_RANGE_POWER	CC2500_POWER_1
 | 
				
			||||||
#define CC2500_BIND_POWER	CC2500_POWER_1
 | 
					#define CC2500_BIND_POWER	CC2500_POWER_1
 | 
				
			||||||
 | 
				
			|||||||
@ -106,6 +106,19 @@ uint8_t  RX_num;
 | 
				
			|||||||
	uint8_t calData[48];
 | 
						uint8_t calData[48];
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CHECK_FOR_BOOTLOADER
 | 
				
			||||||
 | 
					uint8_t BootTimer ;
 | 
				
			||||||
 | 
					uint8_t BootState ;
 | 
				
			||||||
 | 
					uint8_t NotBootChecking ;
 | 
				
			||||||
 | 
					uint8_t BootCount ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define BOOT_WAIT_30_IDLE		0
 | 
				
			||||||
 | 
					#define BOOT_WAIT_30_DATA		1
 | 
				
			||||||
 | 
					#define BOOT_WAIT_20				2
 | 
				
			||||||
 | 
					#define BOOT_READY					3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//Channel mapping for protocols
 | 
					//Channel mapping for protocols
 | 
				
			||||||
const uint8_t CH_AETR[]={AILERON, ELEVATOR, THROTTLE, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8, AUX9, AUX10};
 | 
					const uint8_t CH_AETR[]={AILERON, ELEVATOR, THROTTLE, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8, AUX9, AUX10};
 | 
				
			||||||
const uint8_t CH_TAER[]={THROTTLE, AILERON, ELEVATOR, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8};
 | 
					const uint8_t CH_TAER[]={THROTTLE, AILERON, ELEVATOR, RUDDER, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8};
 | 
				
			||||||
@ -392,12 +405,91 @@ void setup()
 | 
				
			|||||||
			protocol=0;
 | 
								protocol=0;
 | 
				
			||||||
			servo_max_100=SERIAL_MAX_100; servo_min_100=SERIAL_MIN_100;
 | 
								servo_max_100=SERIAL_MAX_100; servo_min_100=SERIAL_MIN_100;
 | 
				
			||||||
			servo_max_125=SERIAL_MAX_125; servo_min_125=SERIAL_MIN_125;
 | 
								servo_max_125=SERIAL_MAX_125; servo_min_125=SERIAL_MIN_125;
 | 
				
			||||||
 | 
					#ifdef CHECK_FOR_BOOTLOADER
 | 
				
			||||||
 | 
								Mprotocol_serial_init(1); 	// Configure serial and enable RX interrupt
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
			Mprotocol_serial_init(); 	// Configure serial and enable RX interrupt
 | 
								Mprotocol_serial_init(); 	// Configure serial and enable RX interrupt
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
		#endif //ENABLE_SERIAL
 | 
							#endif //ENABLE_SERIAL
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	servo_mid=servo_min_100+servo_max_100;	//In fact 2* mid_value
 | 
						servo_mid=servo_min_100+servo_max_100;	//In fact 2* mid_value
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CHECK_FOR_BOOTLOADER
 | 
				
			||||||
 | 
					void pollBoot()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint8_t rxchar ;
 | 
				
			||||||
 | 
						uint8_t lState = BootState ;
 | 
				
			||||||
 | 
						uint8_t millisTime = millis() ;	// Call this once only
 | 
				
			||||||
 | 
					#ifdef ORANGE_TX
 | 
				
			||||||
 | 
					  if ( USARTC0.STATUS & USART_RXCIF_bm )
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						if ( UCSR0A & ( 1 << RXC0 ) )
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							rxchar = UDR0 ;
 | 
				
			||||||
 | 
							BootCount += 1 ;
 | 
				
			||||||
 | 
							if ( ( lState == BOOT_WAIT_30_IDLE ) || ( lState == BOOT_WAIT_30_DATA ) )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if ( lState == BOOT_WAIT_30_IDLE )	// Waiting for 0x30
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									BootTimer = millisTime ;	// Start timeout
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if ( rxchar == 0x30 )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									lState = BOOT_WAIT_20 ;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									lState = BOOT_WAIT_30_DATA ;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if ( lState == BOOT_WAIT_20 )	// Waiting for 0x20
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if ( rxchar == 0x20 )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									lState = BOOT_READY ;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else // No byte received
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( lState != BOOT_WAIT_30_IDLE )	// Something received
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								uint8_t time = millisTime - BootTimer ;
 | 
				
			||||||
 | 
								if ( time > 5 )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									if ( BootCount > 2 )
 | 
				
			||||||
 | 
									{ // Run normally
 | 
				
			||||||
 | 
										NotBootChecking = 0xFF ;
 | 
				
			||||||
 | 
										Mprotocol_serial_init( 0 ) ;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else if ( lState == BOOT_READY )
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										cli();					// Disable global int due to RW of 16 bits registers
 | 
				
			||||||
 | 
										void (*p)() ;
 | 
				
			||||||
 | 
					#ifndef ORANGE_TX
 | 
				
			||||||
 | 
										p = (void (*)())0x3F00 ;	// Word address (0x7E00 byte)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
										p = (void (*)())0x4000 ;	// Word address (0x8000 byte)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
										(*p)() ;
 | 
				
			||||||
 | 
										// go to boot
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										lState = BOOT_WAIT_30_IDLE ;
 | 
				
			||||||
 | 
										BootCount = 0 ;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						BootState = lState ;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Main
 | 
					// Main
 | 
				
			||||||
// Protocol scheduler
 | 
					// Protocol scheduler
 | 
				
			||||||
void loop()
 | 
					void loop()
 | 
				
			||||||
@ -485,6 +577,13 @@ void loop()
 | 
				
			|||||||
uint8_t Update_All()
 | 
					uint8_t Update_All()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	#ifdef ENABLE_SERIAL
 | 
						#ifdef ENABLE_SERIAL
 | 
				
			||||||
 | 
					#ifdef CHECK_FOR_BOOTLOADER
 | 
				
			||||||
 | 
							if ( (mode_select==MODE_SERIAL) && (NotBootChecking == 0) )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								pollBoot() ;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
		if(mode_select==MODE_SERIAL && IS_RX_FLAG_on)		// Serial mode and something has been received
 | 
							if(mode_select==MODE_SERIAL && IS_RX_FLAG_on)		// Serial mode and something has been received
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			update_serial_data();							// Update protocol and data
 | 
								update_serial_data();							// Update protocol and data
 | 
				
			||||||
@ -1093,7 +1192,11 @@ void modules_reset()
 | 
				
			|||||||
	prev_power=0xFD;		// unused power value
 | 
						prev_power=0xFD;		// unused power value
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CHECK_FOR_BOOTLOADER
 | 
				
			||||||
 | 
					void Mprotocol_serial_init( uint8_t boot )
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
void Mprotocol_serial_init()
 | 
					void Mprotocol_serial_init()
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	#ifdef ORANGE_TX
 | 
						#ifdef ORANGE_TX
 | 
				
			||||||
		PORTC.OUTSET = 0x08 ;
 | 
							PORTC.OUTSET = 0x08 ;
 | 
				
			||||||
@ -1103,12 +1206,23 @@ void Mprotocol_serial_init()
 | 
				
			|||||||
		USARTC0.BAUDCTRLB = 0 ;
 | 
							USARTC0.BAUDCTRLB = 0 ;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		USARTC0.CTRLB = 0x18 ;
 | 
							USARTC0.CTRLB = 0x18 ;
 | 
				
			||||||
		USARTC0.CTRLA = (USARTC0.CTRLA & 0xCF) | 0x10 ;
 | 
							USARTC0.CTRLA = (USARTC0.CTRLA & 0xCC) | 0x11 ;
 | 
				
			||||||
		USARTC0.CTRLC = 0x2B ;
 | 
							USARTC0.CTRLC = 0x2B ;
 | 
				
			||||||
		UDR0 ;
 | 
							UDR0 ;
 | 
				
			||||||
		#ifdef INVERT_SERIAL
 | 
							#ifdef INVERT_SERIAL
 | 
				
			||||||
			PORTC.PIN3CTRL |= 0x40 ;
 | 
								PORTC.PIN3CTRL |= 0x40 ;
 | 
				
			||||||
		#endif
 | 
							#endif
 | 
				
			||||||
 | 
					#ifdef CHECK_FOR_BOOTLOADER
 | 
				
			||||||
 | 
							if ( boot )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								USARTC0.BAUDCTRLB = 0 ;
 | 
				
			||||||
 | 
								USARTC0.BAUDCTRLA = 33 ;		// 57600
 | 
				
			||||||
 | 
								USARTC0.CTRLA = (USARTC0.CTRLA & 0xC0) ;
 | 
				
			||||||
 | 
								USARTC0.CTRLC = 0x03 ;	// 8 bit, no parity, 1 stop
 | 
				
			||||||
 | 
								USARTC0.CTRLB = 0x18 ;		// Enable Tx and Rx
 | 
				
			||||||
 | 
								PORTC.PIN3CTRL &= ~0x40 ;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#endif // CHECK_FOR_BOOTLOADER
 | 
				
			||||||
	#elif defined STM32_BOARD
 | 
						#elif defined STM32_BOARD
 | 
				
			||||||
		usart2_begin(100000,SERIAL_8E2);
 | 
							usart2_begin(100000,SERIAL_8E2);
 | 
				
			||||||
		usart3_begin(100000,SERIAL_8E2);
 | 
							usart3_begin(100000,SERIAL_8E2);
 | 
				
			||||||
@ -1132,6 +1246,16 @@ void Mprotocol_serial_init()
 | 
				
			|||||||
				initTXSerial( SPEED_100K ) ;
 | 
									initTXSerial( SPEED_100K ) ;
 | 
				
			||||||
			#endif //TELEMETRY
 | 
								#endif //TELEMETRY
 | 
				
			||||||
		#endif //DEBUG_TX
 | 
							#endif //DEBUG_TX
 | 
				
			||||||
 | 
					#ifdef CHECK_FOR_BOOTLOADER
 | 
				
			||||||
 | 
							if ( boot )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								UBRR0H = 0 ;
 | 
				
			||||||
 | 
								UBRR0L = 33 ;		// 57600
 | 
				
			||||||
 | 
								UCSR0C &= ~_BV(UPM01) ;	// No parity
 | 
				
			||||||
 | 
								UCSR0B &= ~_BV(RXCIE0);// No rx interrupt
 | 
				
			||||||
 | 
							  UCSR0A |= _BV(U2X0); //Double speed mode USART0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#endif // CHECK_FOR_BOOTLOADER
 | 
				
			||||||
	#endif //ORANGE_TX
 | 
						#endif //ORANGE_TX
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -31,6 +31,18 @@ uint8_t RetrySequence ;
 | 
				
			|||||||
	uint8_t sport_counter=0;
 | 
						uint8_t sport_counter=0;
 | 
				
			||||||
	uint8_t RxBt = 0;
 | 
						uint8_t RxBt = 0;
 | 
				
			||||||
	uint8_t sport = 0;
 | 
						uint8_t sport = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct t_fx_rx_packet
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint8_t validSequence ;
 | 
				
			||||||
 | 
						uint8_t count ;
 | 
				
			||||||
 | 
						uint8_t payload[6] ;
 | 
				
			||||||
 | 
					} ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Store for out of sequence packet
 | 
				
			||||||
 | 
					struct t_fx_rx_packet FrskyxRxTelemetry ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if defined HUB_TELEMETRY
 | 
					#if defined HUB_TELEMETRY
 | 
				
			||||||
	#define USER_MAX_BYTES 6
 | 
						#define USER_MAX_BYTES 6
 | 
				
			||||||
@ -205,19 +217,73 @@ void frsky_check_telemetry(uint8_t *pkt,uint8_t len)
 | 
				
			|||||||
		telemetry_lost=0;
 | 
							telemetry_lost=0;
 | 
				
			||||||
		if (protocol==MODE_FRSKYX)
 | 
							if (protocol==MODE_FRSKYX)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if ((pktt[5] >> 4 & 0x0f) == 0x08)
 | 
								uint16_t lcrc = crc_x(&pkt[3], len-7) ;
 | 
				
			||||||
 | 
								if ( ( (lcrc >> 8) == pkt[len-4]) && ( (lcrc & 0x00FF ) == pkt[len-3]) )
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				seq_last_sent = 8;
 | 
									// Check if in sequence
 | 
				
			||||||
				seq_last_rcvd = 0;
 | 
									if ( (pkt[5] & 0x0F) == 0x08 )
 | 
				
			||||||
				pass=0;
 | 
									{
 | 
				
			||||||
			} 
 | 
										FrX_receive_seq = 0x08 ;
 | 
				
			||||||
			else
 | 
									}
 | 
				
			||||||
			{
 | 
									else if ( (pkt[5] & 0x03) == (FrX_receive_seq & 0x03 ) )
 | 
				
			||||||
				if ((pktt[5] >> 4 & 0x03) == (seq_last_rcvd + 1) % 4)
 | 
									{
 | 
				
			||||||
					seq_last_rcvd = (seq_last_rcvd + 1) % 4;
 | 
										// OK to process
 | 
				
			||||||
 | 
										FrX_receive_seq = ( FrX_receive_seq + 1 ) & 0x03 ;
 | 
				
			||||||
 | 
										if ( FrskyxRxTelemetry.validSequence & 0x80 )
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											FrX_receive_seq = ( FrskyxRxTelemetry.validSequence + 1 ) & 3 ;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
					pass=0;//reset if sequence wrong
 | 
									{
 | 
				
			||||||
 | 
										// Save and request correct packet
 | 
				
			||||||
 | 
										struct t_fx_rx_packet *p ;
 | 
				
			||||||
 | 
										uint8_t count ;
 | 
				
			||||||
 | 
							// pkt[4] RSSI
 | 
				
			||||||
 | 
							// pkt[5] sequence control
 | 
				
			||||||
 | 
							// pkt[6] payload count
 | 
				
			||||||
 | 
							// pkt[7-12] payload			
 | 
				
			||||||
 | 
										pktt[6] = 0 ; // Don't process
 | 
				
			||||||
 | 
										p = &FrskyxRxTelemetry ;
 | 
				
			||||||
 | 
										count = pkt[6] ;
 | 
				
			||||||
 | 
										if ( count <= 6 )
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											p->count = count ;
 | 
				
			||||||
 | 
											for ( uint8_t i = 0 ; i < count ; i += 1 )
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												p->payload[i] = pkt[i+7] ;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											p->validSequence = 0x80 | ( pkt[5] & 0x03 ) ;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										FrX_receive_seq = ( FrX_receive_seq & 0x03 ) | 0x04 ;	// Request re-transmission
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (((pktt[5] >> 4) & 0x0f) == 0x08)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										FrX_send_seq = 0 ;
 | 
				
			||||||
 | 
					//					FrX_receive_seq = 0x08 ;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
					//			packet[21] = (FrX_receive_seq << 4) | FrX_send_seq ;//8 at start
 | 
				
			||||||
 | 
					//			if ( FrX_send_seq != 0x08 )
 | 
				
			||||||
 | 
					//			{
 | 
				
			||||||
 | 
					//				FrX_send_seq = ( FrX_send_seq + 1 ) & 0x03 ;
 | 
				
			||||||
 | 
					//			}
 | 
				
			||||||
 | 
								 
 | 
				
			||||||
 | 
					//			if ((pktt[5] >> 4 & 0x0f) == 0x08)
 | 
				
			||||||
 | 
					//			{  
 | 
				
			||||||
 | 
					//				seq_last_sent = 8;
 | 
				
			||||||
 | 
					//				seq_last_rcvd = 0;
 | 
				
			||||||
 | 
					//				pass=0;
 | 
				
			||||||
 | 
					//			} 
 | 
				
			||||||
 | 
					//			else
 | 
				
			||||||
 | 
					//			{
 | 
				
			||||||
 | 
					//				if ((pktt[5] >> 4 & 0x03) == (seq_last_rcvd + 1) % 4)
 | 
				
			||||||
 | 
					//					seq_last_rcvd = (seq_last_rcvd + 1) % 4;
 | 
				
			||||||
 | 
					//				else
 | 
				
			||||||
 | 
					//					pass=0;//reset if sequence wrong
 | 
				
			||||||
 | 
					//			}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -573,8 +639,20 @@ void TelemetryUpdate()
 | 
				
			|||||||
				else 
 | 
									else 
 | 
				
			||||||
					RxBt = (pktt[4]<<1) + 1 ;
 | 
										RxBt = (pktt[4]<<1) + 1 ;
 | 
				
			||||||
				if(pktt[6] && pktt[6]<=6)
 | 
									if(pktt[6] && pktt[6]<=6)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
					for (uint8_t i=0; i < pktt[6]; i++)
 | 
										for (uint8_t i=0; i < pktt[6]; i++)
 | 
				
			||||||
						proces_sport_data(pktt[7+i]);
 | 
											proces_sport_data(pktt[7+i]);
 | 
				
			||||||
 | 
										if ( FrskyxRxTelemetry.validSequence & 0x80 )
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											// Process out of sequence packet
 | 
				
			||||||
 | 
											for (uint8_t i=0; i < FrskyxRxTelemetry.count ; i++)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												proces_sport_data( FrskyxRxTelemetry.payload[i] ) ;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
					//						FrX_receive_seq = ( FrskyxRxTelemetry.validSequence + 1 ) & 3 ;
 | 
				
			||||||
 | 
											FrskyxRxTelemetry.validSequence = 0 ;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
				telemetry_link=0;
 | 
									telemetry_link=0;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			uint32_t now = micros();
 | 
								uint32_t now = micros();
 | 
				
			||||||
 | 
				
			|||||||
@ -49,6 +49,15 @@
 | 
				
			|||||||
//The goal is to prevent binding other people's model when powering up the TX, changing model or scanning through protocols.
 | 
					//The goal is to prevent binding other people's model when powering up the TX, changing model or scanning through protocols.
 | 
				
			||||||
#define WAIT_FOR_BIND
 | 
					#define WAIT_FOR_BIND
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*************************/
 | 
				
			||||||
 | 
					/*** BOOTLOADER USE     ***/
 | 
				
			||||||
 | 
					/*************************/
 | 
				
			||||||
 | 
					#define CHECK_FOR_BOOTLOADER
 | 
				
			||||||
 | 
					//Allow flashing multimodule directly with TX(erky9x or opentx modified firmwares)
 | 
				
			||||||
 | 
					//1. Start ersky9x in bootloader mode and copy the multi.hex file into the firmware directory on the SD card.
 | 
				
			||||||
 | 
					//2. Disconnect the USB, then press EXIT LONG while holding the horizontal trims APART to enter "maintenance mode".
 | 
				
			||||||
 | 
					//3. Select "Update Multi", then HEX mode, then select the file and start the flash.
 | 
				
			||||||
 | 
					//4. When finished, EXIT back to reboot in normal mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/****************/
 | 
					/****************/
 | 
				
			||||||
/*** RF CHIPS ***/
 | 
					/*** RF CHIPS ***/
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user