mirror of
				https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
				synced 2025-10-31 19:41:04 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  This project is free software: you can redistribute it and/or modify
 | |
|  it under the terms of the GNU General Public License as published by
 | |
|  the Free Software Foundation, either version 3 of the License, or
 | |
|  (at your option) any later version.
 | |
| 
 | |
| Multiprotocol is distributed in the hope that it will be useful,
 | |
|  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  GNU General Public License for more details.
 | |
| 
 | |
|  You should have received a copy of the GNU General Public License
 | |
|  along with Multiprotocol.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| // Compatible with JJRC ZSX-280 plane.
 | |
| 
 | |
| #if defined(ZSX_NRF24L01_INO)
 | |
| 
 | |
| #include "iface_xn297.h"
 | |
| 
 | |
| //#define FORCE_ZSX_ORIGINAL_ID
 | |
| 
 | |
| #define ZSX_INITIAL_WAIT	500
 | |
| #define ZSX_PACKET_PERIOD	10093
 | |
| #define ZSX_RF_BIND_CHANNEL	7
 | |
| #define ZSX_PAYLOAD_SIZE	6
 | |
| #define ZSX_BIND_COUNT		50
 | |
| #define ZSX_RF_NUM_CHANNELS	1
 | |
| 
 | |
| static void __attribute__((unused)) ZSX_send_packet()
 | |
| {
 | |
| 	memcpy(&packet[1],rx_tx_addr,3);
 | |
| 	if(IS_BIND_IN_PROGRESS)
 | |
| 	{
 | |
| 		packet[0] = 0xAA;
 | |
| 		packet[4] = 0x00;
 | |
| 		packet[5] = 0x00;
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		packet[0]= 0x55;
 | |
| 		packet[4]= 0xFF-convert_channel_8b(RUDDER);		// FF..80..01
 | |
| 		packet[5]= convert_channel_8b(THROTTLE)>>1		// 0..7F
 | |
| 				| GET_FLAG(CH5_SW, 0x80);				// Light
 | |
| 	}
 | |
| 
 | |
| 	// Send
 | |
| 	XN297_SetPower();
 | |
| 	XN297_SetTxRxMode(TX_EN);
 | |
| 	XN297_WritePayload(packet, ZSX_PAYLOAD_SIZE);
 | |
| }
 | |
| 
 | |
| static void __attribute__((unused)) ZSX_initialize_txid()
 | |
| {
 | |
| 	rx_tx_addr[0]=rx_tx_addr[3];	// Use RX_num;
 | |
| 	#ifdef FORCE_ZSX_ORIGINAL_ID
 | |
| 		//TX1
 | |
| 		rx_tx_addr[0]=0x03;
 | |
| 		rx_tx_addr[1]=0x01;
 | |
| 		rx_tx_addr[2]=0xC3;
 | |
| 	#endif
 | |
| }
 | |
| 
 | |
| static void __attribute__((unused)) ZSX_RF_init()
 | |
| {
 | |
| 	XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
 | |
| 	XN297_SetTXAddr((uint8_t*)"\xc1\xc2\xc3", 3);
 | |
| 	XN297_RFChannel(ZSX_RF_BIND_CHANNEL);	// Set bind channel
 | |
| }
 | |
| 
 | |
| uint16_t ZSX_callback()
 | |
| {
 | |
| 	#ifdef MULTI_SYNC
 | |
| 		telemetry_set_input_sync(ZSX_PACKET_PERIOD);
 | |
| 	#endif
 | |
| 	if(bind_counter)
 | |
| 		if(--bind_counter==0)
 | |
| 		{
 | |
| 			BIND_DONE;
 | |
| 			XN297_SetTXAddr(rx_tx_addr, 3);
 | |
| 			XN297_RFChannel(0x00);
 | |
| 		}
 | |
| 	ZSX_send_packet();
 | |
| 	return ZSX_PACKET_PERIOD;
 | |
| }
 | |
| 
 | |
| void ZSX_init()
 | |
| {
 | |
| 	BIND_IN_PROGRESS;	// autobind protocol
 | |
| 	ZSX_initialize_txid();
 | |
| 	ZSX_RF_init();
 | |
| 	bind_counter=ZSX_BIND_COUNT;
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| // XN297 speed 1Mb, scrambled
 | |
| // Bind
 | |
| //   channel 7
 | |
| //   address: C1 C2 C3
 | |
| //   P(6)= AA 03 01 C3 00 00
 | |
| //   03 01 C3 <- normal address
 | |
| // Normal
 | |
| //   channel 0 and seems to be fixed
 | |
| //   address: 03 01 C3
 | |
| //   P(6)= 55 03 01 C3 80 00
 | |
| //   03 01 C3 <- normal address
 | |
| //   80 <- rudder FF..80..01
 | |
| //   00 <- throttle 00..7F, light flag 0x80
 |