/* 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 . Thanks to Goebish ,Ported from his deviation firmware */ #if defined(YUXIANG_NRF24L01_INO) #include "iface_xn297.h" #define YUXIANG_FORCE_ID #define YUXIANG_PACKET_PERIOD 12422 #define YUXIANG_PACKET_SIZE 9 #define YUXIANG_BIND_COUNT 150 #define YUXIANG_BIND_FREQ 0x30 #define YUXIANG_RF_NUM_CHANNELS 4 #define YUXIANG_WRITE_TIME 1000 >>#define YUXIANG_TELEM_DEBUG enum { YUXIANG_DATA = 0, YUXIANG_RX }; static void __attribute__((unused)) YUXIANG_send_packet() { if(bind_counter && packet_sent < 5 && (hopping_frequency_no & 0x07) == 0) { bind_counter--; if(!bind_counter) BIND_DONE; #if 0 debug("B C:%d, ",YUXIANG_BIND_FREQ); #endif XN297_RFChannel(YUXIANG_BIND_FREQ); XN297_SetTXAddr((uint8_t*)"\x00\x00\x00\x00\x00", 5); bind_phase = 1; packet_sent++; } else {//Normal operation XN297_Hopping(hopping_frequency_no & 0x03); #if 0 debug("C:%d, ",hopping_frequency[hopping_frequency_no & 0x03]); #endif hopping_frequency_no++; if(bind_phase) { XN297_SetTXAddr(rx_tx_addr, 5); XN297_SetRXAddr(rx_tx_addr, YUXIANG_PACKET_SIZE); bind_phase = 0; packet_sent = 0; } } packet[0] = GET_FLAG(!bind_phase, 0x80) // Bind packet | GET_FLAG(telemetry_lost, 0x20) // No telem | GET_FLAG(!CH5_SW, 0x10) // Lock | GET_FLAG(CH6_SW, 0x08) // High | GET_FLAG(CH11_SW, 0x01); // Screw pitch -> temporary packet[1] = GET_FLAG(CH7_SW, 0x08) // Land only when unlock | GET_FLAG(CH10_SW, 0x20); // Mode packet[2] = GET_FLAG(CH5_SW, 0x02) // Altitude hold set when unlock | GET_FLAG(CH8_SW, 0x01) // Manual | GET_FLAG(CH9_SW, 0x40); // Flip uint16_t value = convert_channel_16b_limit(AILERON,0,1000); packet[3] = value; packet[7] = value >> 8; value = convert_channel_16b_limit(ELEVATOR,0,1000); packet[4] = value; packet[7] |= (value >> 6) & 0x0C; value = convert_channel_16b_limit(THROTTLE,0,1000); packet[5] = value; packet[7] |= (value >> 4) & 0x30; value = convert_channel_16b_limit(RUDDER,0,1000); packet[6] = value; packet[7] |= (value >> 2) & 0xC0; if(bind_phase) memcpy(&packet[3], rx_tx_addr, 4); uint8_t checksum = 0; for(uint8_t i=0; i 240) // Around 3sec with no telemetry telemetry_lost = 1; else packet_count++; #endif #ifdef MULTI_SYNC telemetry_set_input_sync(YUXIANG_PACKET_PERIOD); #endif YUXIANG_send_packet(); if(rx) { // Check if a packet has been received #ifdef YUXIANG_TELEM_DEBUG debug("RX "); #endif if(XN297_ReadPayload(packet_in, YUXIANG_PACKET_SIZE)) { // packet with good CRC and length uint8_t checksum = 0; for(uint8_t i=0; i