diff --git a/Multiprotocol/Cyrf6936_wk2x01.ino b/Multiprotocol/Cyrf6936_wk2x01.ino index 363dd61..58e866a 100644 --- a/Multiprotocol/Cyrf6936_wk2x01.ino +++ b/Multiprotocol/Cyrf6936_wk2x01.ino @@ -31,7 +31,7 @@ static const uint8_t sopcode[8] = { static const uint8_t fail_map[8] = {2, 1, 0, 3, 4, 5, 6, 7}; static uint8_t wk_pkt_num; -static u8 *radio_ch_ptr; +static uint8_t *radio_ch_ptr; static uint16_t WK_BIND_COUNTer; static uint8_t last_beacon; /* @@ -41,11 +41,11 @@ static const char * const wk2601_opts[] = { _tr_noop("COL Limit"), "-100", "100", NULL, NULL }; -*/ #define WK2601_OPT_CHANMODE 0 #define WK2601_OPT_PIT_INV 1 #define WK2601_OPT_PIT_LIMIT 2 #define LAST_PROTO_OPT 3 +*/ static void add_pkt_crc(uint8_t init) { uint8_t add = init; @@ -177,14 +177,14 @@ static void channels_heli_2601(int frame, int *v1, int *v2) { //pitch is controlled by rx //we can only control fmode, pit-reverse and pit/thr rate int pit_rev = 0; - if (Model.proto_opts[WK2601_OPT_PIT_INV]) { pit_rev = 1; } + if ((option/10)%10) { pit_rev = 1; } uint16_t pit_rate = get_channel(5, 0x400, 0, 0x400); int fmode = 1; if (pit_rate < 0) { pit_rate = -pit_rate; fmode = 0; } if (frame == 1) { //Pitch curve and range *v1 = pit_rate; - *v2 = Model.proto_opts[WK2601_OPT_PIT_LIMIT] * 0x400 / 100 + 0x400; + *v2 = ((option/100) ? -100 : 100) * 0x400 / 100 + 0x400; } packet[7] = (pit_rev << 2); //reverse bits packet[8] = fmode ? 0x02 : 0x00; @@ -207,8 +207,8 @@ static void build_data_pkt_2601() { v1 = get_channel(6, 0x200, 0x200, 0x200); v2 = 0; } - if (Model.proto_opts[WK2601_OPT_CHANMODE] == 1) { channels_heli_2601(frame, &v1, &v2); } - else if (Model.proto_opts[WK2601_OPT_CHANMODE] == 2) { channels_6plus1_2601(frame, &v1, &v2); } + if (option%10 == 1) { channels_heli_2601(frame, &v1, &v2); } + else if (option%10 == 2) { channels_6plus1_2601(frame, &v1, &v2); } else { channels_5plus1_2601(frame, &v1, &v2); } if (v1 > 1023) { v1 = 1023; } if (v2 > 1023) { v2 = 1023; } diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 46f6697..b16107e 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -24,7 +24,7 @@ #include #include #include -#include "multiprotocol.h" +#include "Multiprotocol.h" //Multiprotocol module configuration file #include "_Config.h" diff --git a/Multiprotocol/Nrf24l01_fy326.ino b/Multiprotocol/Nrf24l01_fy326.ino index 5fe0a92..2c8f943 100644 --- a/Multiprotocol/Nrf24l01_fy326.ino +++ b/Multiprotocol/Nrf24l01_fy326.ino @@ -23,21 +23,11 @@ #define FY326_SIZE 15 #define FY326_BIND_COUNT 16 - -static const char * const fy326_opts[] = { - _tr_noop("Expert"), _tr_noop("On"), _tr_noop("Off"), NULL, - NULL -}; -#define EXPERT_ON 0 -#define EXPERT_OFF 1 - #define CHANNEL_FLIP AUX1 #define CHANNEL_HEADLESS AUX2 #define CHANNEL_RTH AUX3 #define CHANNEL_CALIBRATE AUX4 - -static uint8_t tx_power; -static uint8_t packet[FY326_SIZE]; +#define CHANNEL_EXPERT AUX5 // frequency channel management #define RF_BIND_CHANNEL 0x17 @@ -51,24 +41,27 @@ enum { FY326_INIT1 = 0, FY326_BIND1, FY326_BIND2, - FY326_DATA + FY326_DATA, + FY319_INIT1, + FY319_BIND1, + FY319_BIND2, }; // Bit vector from bit position #define BV(bit) (1 << bit) -#define CHAN_RANGE (CHAN_MAX_VALUE - CHAN_MIN_VALUE) +#define CHAN_RANGE (PPM_MAX - PPM_MIN) static uint8_t scale_channel(uint8_t ch, uint8_t destMin, uint8_t destMax) { - uint32_t chanval = Channels[ch]; + uint32_t chanval = Servo_data[ch]; uint32_t range = destMax - destMin; - if (chanval < CHAN_MIN_VALUE) chanval = CHAN_MIN_VALUE; - else if (chanval > CHAN_MAX_VALUE) chanval = CHAN_MAX_VALUE; - return (range * (chanval - CHAN_MIN_VALUE)) / CHAN_RANGE + destMin; + if (chanval < PPM_MIN) chanval = PPM_MIN; + else if (chanval > PPM_MAX) chanval = PPM_MAX; + return (range * (chanval - PPM_MIN)) / CHAN_RANGE + destMin; } -#define GET_FLAG(ch, mask) (Channels[ch] > 0 ? mask : 0) +#define GET_FLAG(ch, mask) (Servo_data[ch] > PPM_MIN_COMMAND ? mask : 0) #define CHAN_TO_TRIM(chanval) ((uint8_t)(((uint16_t)chanval/10)-10)) // scale to [-10,10]. [-20,20] caused problems. static void send_packet(uint8_t bind) { @@ -80,15 +73,22 @@ static void send_packet(uint8_t bind) | GET_FLAG(CHANNEL_RTH, 0x40) | GET_FLAG(CHANNEL_FLIP, 0x02) | GET_FLAG(CHANNEL_CALIBRATE, 0x01) - | (Model.proto_opts[PROTOOPTS_EXPERT] == EXPERT_ON ? 4 : 0); + | GET_FLAG(CHANNEL_EXPERT, 4); } packet[2] = 200 - scale_channel(AILERON, 0, 200); // aileron packet[3] = scale_channel(ELEVATOR, 0, 200); // elevator packet[4] = 200 - scale_channel(RUDDER, 0, 200); // rudder packet[5] = scale_channel(THROTTLE, 0, 200); // throttle - packet[6] = txid[0]; - packet[7] = txid[1]; - packet[8] = txid[2]; + if(sub_protocol == FY319) { + packet[6] = 255 - scale_channel(CHANNEL1, 0, 255); + packet[7] = scale_channel(CHANNEL2, 0, 255); + packet[8] = 255 - scale_channel(CHANNEL4, 0, 255); + } + else { + packet[6] = txid[0]; + packet[7] = txid[1]; + packet[8] = txid[2]; + } packet[9] = CHAN_TO_TRIM(packet[2]); // aileron_trim; packet[10] = CHAN_TO_TRIM(packet[3]); // elevator_trim; packet[11] = CHAN_TO_TRIM(packet[4]); // rudder_trim; @@ -108,25 +108,18 @@ static void send_packet(uint8_t bind) NRF24L01_FlushTx(); NRF24L01_WritePayload(packet, FY326_SIZE); - - // Check and adjust transmission power. We do this after - // transmission to not bother with timeout after power - // settings change - we have plenty of time until next - // packet. - if (tx_power != Model.tx_power) { - //Keep transmit power updated - tx_power = Model.tx_power; - NRF24L01_SetPower(tx_power); - } } static void fy326_init() { - const uint8_t rx_tx_addr[] = {0x15, 0x59, 0x23, 0xc6, 0x29}; + uint8_t rx_tx_addr[] = {0x15, 0x59, 0x23, 0xc6, 0x29}; NRF24L01_Initialize(); NRF24L01_SetTxRxMode(TX_EN); - NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x01); // Three-byte rx/tx address + if(sub_protocol == FY319) + NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // Five-byte rx/tx address + else + NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x01); // Three-byte rx/tx address NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, sizeof(rx_tx_addr)); NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0, rx_tx_addr, sizeof(rx_tx_addr)); NRF24L01_FlushTx(); @@ -137,7 +130,7 @@ static void fy326_init() NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, FY326_SIZE); NRF24L01_WriteReg(NRF24L01_05_RF_CH, RF_BIND_CHANNEL); NRF24L01_SetBitrate(NRF24L01_BR_250K); - NRF24L01_SetPower(Model.tx_power); + NRF24L01_SetPower(); NRF24L01_Activate(0x73); NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 0x3f); @@ -146,9 +139,51 @@ static void fy326_init() static uint16_t fy326_callback() { + uint8_t i; switch (phase) { + case FY319_INIT1: + NRF24L01_SetTxRxMode(TXRX_OFF); + NRF24L01_FlushRx(); + NRF24L01_SetTxRxMode(RX_EN); + NRF24L01_WriteReg(NRF24L01_05_RF_CH, RF_BIND_CHANNEL); + phase = FY319_BIND1; + BIND_IN_PROGRESS; + return PACKET_CHKTIME; + break; + + case FY319_BIND1: + if(NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR)) { + NRF24L01_ReadPayload(packet, FY326_SIZE); + rxid = packet[13]; + packet[0] = txid[3]; + packet[1] = 0x80; + packet[14]= txid[4]; + bind_counter = BIND_COUNT; + NRF24L01_SetTxRxMode(TXRX_OFF); + NRF24L01_SetTxRxMode(TX_EN); + NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); + NRF24L01_FlushTx(); + bind_counter = 255; + for(i=2; i<6; i++) + packet[i] = rf_chans[0]; + phase = FY319_BIND2; + } + return PACKET_CHKTIME; + break; + + case FY319_BIND2: + NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); + NRF24L01_FlushTx(); + NRF24L01_WritePayload(packet, FY326_SIZE); + if(bind_counter == 250) + packet[1] = 0x40; + if(--bind_counter == 0) { + BIND_DONE; + phase = FY326_DATA; + } + break; + case FY326_INIT1: - MUSIC_Play(MUSIC_TELEMALARM1); bind_counter = FY326_BIND_COUNT; phase = FY326_BIND2; send_packet(1); @@ -156,19 +191,13 @@ static uint16_t fy326_callback() break; case FY326_BIND1: -#ifdef EMULATOR - if (1) { - packet[13] = 0x7e; -#else if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR)) { // RX fifo data ready NRF24L01_ReadPayload(packet, FY326_SIZE); -#endif rxid = packet[13]; txid[0] = 0xaa; NRF24L01_SetTxRxMode(TXRX_OFF); NRF24L01_SetTxRxMode(TX_EN); - PROTOCOL_SetBindState(0); - MUSIC_Play(MUSIC_DONE_BINDING); + BIND_DONE; phase = FY326_DATA; } else if (bind_counter-- == 0) { bind_counter = FY326_BIND_COUNT; @@ -181,11 +210,7 @@ static uint16_t fy326_callback() break; case FY326_BIND2: -#ifdef EMULATOR - if (1) { -#else if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_TX_DS)) { // TX data sent -#endif // switch to RX mode NRF24L01_SetTxRxMode(TXRX_OFF); NRF24L01_FlushRx(); @@ -210,7 +235,7 @@ static void fy_txid() txid[1] = ((MProtocol_id_master >> 16) & 0xFF); txid[2] = (MProtocol_id_master >> 8) & 0xFF; txid[3] = MProtocol_id_master & 0xFF; - for (uint8_t i = 0; i < sizeof(MProtocol_id_master); ++i) rand32_r(&MProtocol_id_master, 0); +// for (uint8_t i = 0; i < sizeof(MProtocol_id_master); ++i) rand32_r(&MProtocol_id_master, 0); txid[4] = MProtocol_id_master & 0xFF; rf_chans[0] = txid[0] & 0x0F; @@ -218,14 +243,21 @@ static void fy_txid() rf_chans[2] = 0x20 + (txid[1] & 0x0F); rf_chans[3] = 0x30 + (txid[1] >> 4); rf_chans[4] = 0x40 + (txid[2] >> 4); + + if(sub_protocol == FY319) { + for(uint8_t i=0; i<5; i++) + rf_chans[i] = txid[0] & ~0x80; + } } static uint16_t FY326_setup() { BIND_IN_PROGRESS; - tx_power = Model.tx_power; rxid = 0xaa; - phase = FY326_INIT1; + if(sub_protocol == FY319) + phase = FY319_INIT1; + else + phase = FY326_INIT1; bind_counter = FY326_BIND_COUNT; fy_txid(); fy326_init(); diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index 6c28b62..d39c787 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -48,7 +48,7 @@ #endif #ifdef CYRF6936_INSTALLED #define J6PRO_CYRF6936_INO -// #define WK2x01_CYRF6936_INO + #define WK2x01_CYRF6936_INO #define DEVO_CYRF6936_INO #define DSM2_CYRF6936_INO @@ -61,6 +61,7 @@ #define HM830_NRF24L01_INO #define CFlie_NRF24L01_INO #define H377_NRF24L01_INO + #define FY326_NRF24L01_INO #define BAYANG_NRF24L01_INO #define CG023_NRF24L01_INO diff --git a/Multiprotocol/liste.txt b/Multiprotocol/liste.txt deleted file mode 100644 index 3b9583e..0000000 --- a/Multiprotocol/liste.txt +++ /dev/null @@ -1,65 +0,0 @@ - MODE_SERIAL = 0, // Serial / Manche commands - MODE_FLYSKY = 1, // =>A7105 { Flysky=0, V9X9=1, V6X6=2, V912=3 }; - MODE_HUBSAN = 2, // =>A7105 - MODE_CG023 = 3, // =>NRF24L01 { CG023 = 0, YD829 = 1, H8_3D = 2 }; - MODE_CX10 = 4, // =>NRF24L01 { CX10_GREEN = 0, DM007=2, CX10_BLUE=1, // also compatible with CX10-A, CX12 }; - MODE_HISKY = 6, // =>NRF24L01 { Hisky=0, HK310=1 }; - MODE_DSM2 = 6, // =>CYRF6936 { DSM2=0, DSMX=1}; - MODE_DEVO =7, // =>CYRF6936 - MODE_YD717 = 8, // =>NRF24L01 { YD717=0, SKYWLKR=1, SYMAX2=2, XINXUN=3, NIHUI=4 }; - MODE_KN = 9, // =>NRF24L01 - MODE_SYMAX = 10, // =>NRF24L01 { SYMAX=0, SYMAX5C=1, }; - MODE_SLT = 11, // =>NRF24L01 - MODE_V2X2 = 12, // =>NRF24L01 - MODE_BAYANG = 13, // =>NRF24L01 - MODE_FRSKY = 14, // =>CC2500 - = 15, // => - - BAYANG -AUX1 FLIP -AUX2 HEADLESS -AUX3 RTH -AUX4 SNAPSHOT -AUX5 VIDEO - - CG023 -AUX1 FLIP -AUX2 LED -AUX3 STILL -AUX4 VIDEO -AUX5 EASY - - CX10 -AUX1 FLIP -AUX2 mode 1-2-3 (headless on CX-10A) -AUX3 SNAPSHOT -AUX4 VIDEO -AUX5 HEADLESS - - HUBSAN -AUX1 FLIP -AUX2 LED -AUX3 VIDEO - - KN -AUX1 Dual rate -AUX2 Throttle Hold -AUX3 Idle up -AUX4 Gyro - - V2X2 -AUX1 FLIP -AUX2 LED -AUX3 CAMERA -AUX4 VIDEO -AUX5 HEADLESS -AUX6 MAG_CAL_X -AUX7 MAG_CAL_Y - - YD717 -AUX1 FLIP -AUX2 LED -AUX3 PICTURE -AUX4 VIDEO -AUX5 HEADLESS - diff --git a/Multiprotocol/multiprotocol.h b/Multiprotocol/multiprotocol.h index 42ab887..d731f27 100644 --- a/Multiprotocol/multiprotocol.h +++ b/Multiprotocol/multiprotocol.h @@ -14,9 +14,6 @@ */ // Check selected board type -#ifndef ARDUINO_AVR_PRO -// #error You must select the board type "Arduino Pro or Pro Mini" -#endif #if F_CPU != 16000000L || not defined(__AVR_ATmega328P__) #error You must select the processor type "ATmega328(5V, 16MHz)" #endif @@ -118,12 +115,18 @@ enum MJXQ X800 = 2, H26D = 3 }; + enum WK2X01 { WK2801 = 0, WK2601 = 1, WK2401 = 2 }; +enum FY326 +{ + FY326 = 0, + FY319 = 1 +}; #define NONE 0 #define P_HIGH 1 diff --git a/README.md b/README.md index 24bcc82..dc4bccd 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,36 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12 ###WK2x01 Autobind -En cours ... +####Sub_protocol WK2401 +CH1|CH2|CH3|CH4 +---|---|---|--- +CH1|CH2|CH3|CH4 + + +####Sub_protocol WK2601 +Option: + + 0 = 5+1 + 2 = 6+1 + ..1 = Hélicoptère (. = autres options pour ce mode) + .01 = Hélicoptère normal + .11 = Hélicoptère avec pit inversé + 0.1 = Pitch curve -100 + 1.1 = Pitch curve 100 + +CH1|CH2|CH3|CH4|CH5|CH6|CH7 +---|---|---|---|---|---|--- +CH1|CH2|CH3|CH4|???|CONF|Gyro & Rudder mix + +CONF: Option 1 = Rate Throtle + Option 2 = Pitch + + +####Sub_protocol WK2801 +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 +---|---|---|---|---|---|---|--- +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 + ##A7105 RF Module ###Joysway @@ -59,9 +88,12 @@ A|E|T|R ###Fy326 Autobind -CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 ----|---|---|---|---|---|---|--- -A|E|T|R|FLIP|HEADLESS|RTH|Calibrate +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9 +---|---|---|---|---|---|---|---|--- +A|E|T|R|FLIP|HEADLESS|RTH|Calibrate|Expert + +####Sub_protocol FY319 +Same channels assignement as above. ###H377 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8 @@ -77,3 +109,4 @@ CH1|CH2|CH3|CH4|CH5 ---|---|---|--- A|Turbo|T|Trim|Bouton ??? +###D'autres à venir \ No newline at end of file diff --git a/sync.ffs_db b/sync.ffs_db index af956ef..357e3b1 100644 Binary files a/sync.ffs_db and b/sync.ffs_db differ