@@ -513,7 +513,6 @@ void ProtoState::setupFrame()
513513 trsp.putFrame (COMMAND::CHANNELS_FAILSAFE_DATA,
514514 FRAME_TYPE::REQUEST_SET_NO_RESP, (uint8_t *)failSafe,
515515 AFHDS3_MAX_CHANNELS * 2 + 2 );
516- return ;
517516 }
518517 else if ( isConnected () ){
519518 uint8_t data[AFHDS3_MAX_CHANNELS*2 + 3 ] = { (uint8_t )(RX_CMD_FAILSAFE_VALUE&0xFF ), (uint8_t )((RX_CMD_FAILSAFE_VALUE>>8 )&0xFF ), (uint8_t )(2 *len)};
@@ -524,8 +523,8 @@ void ProtoState::setupFrame()
524523 }
525524 } else {
526525 trsp.putFrame (cmd, FRAME_TYPE::REQUEST_GET_DATA);
527- return ;
528526 }
527+ return ;
529528 }
530529
531530 if (isConnected ()) {
@@ -755,6 +754,7 @@ void ProtoState::parseData(uint8_t* rxBuffer, uint8_t rxBufferCount)
755754 } break ;
756755 case RX_CMD_IBUS_DIRECTION:
757756 if (RX_CMDRESULT::RXSUCCESS==*data++) {
757+ clearDirtyFlag (DC_RX_CMD_IBUS_DIRECTION);
758758 this ->cmd_flg &= ~0x10 ;
759759 if ( 0 ==cfg->version && 2 ==cfg->v0 .ExternalBusType )
760760 this ->cmd_flg |= 0x20 ;
@@ -827,14 +827,14 @@ bool ProtoState::syncSettings()
827827 }
828828 else if ( 2 ==receiver_type (rx_version.ProductNumber ) )
829829 {
830- if (this ->cmd_flg &0x08 )
830+ if (this ->cmd_flg &0x08 )// IBUS
831831 {
832832 uint8_t data[] = { (uint8_t )(RX_CMD_BUS_TYPE_V0&0xFF ), (uint8_t )((RX_CMD_BUS_TYPE_V0>>8 )&0xFF ), 0x1 , 0 };
833833 trsp.putFrame (COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof (data));
834834 this ->cmd_flg |= 0x10 ;
835835 return true ;
836836 }
837- else if ((this ->cmd_flg &0x10 ))
837+ else if ((this ->cmd_flg &0x10 ))// IBUS-IN IBUS-OUT
838838 {
839839 if (busdir>=2 ) busdir = 0 ; // IBUSOUT
840840 uint8_t data1[] = { (uint8_t )(RX_CMD_IBUS_DIRECTION&0xFF ), (uint8_t )((RX_CMD_IBUS_DIRECTION>>8 )&0xFF ), 0x1 , busdir };
@@ -851,7 +851,7 @@ bool ProtoState::syncSettings()
851851 }
852852
853853 // Sync settings when dirty flag is set
854- if (checkDirtyFlag (DC_RX_CMD_TX_PWR))
854+ if (checkDirtyFlag (DC_RX_CMD_TX_PWR))
855855 {
856856 TRACE (" AFHDS3 [RX_CMD_TX_PWR] %d" , AFHDS3_POWER[moduleData->afhds3 .rfPower ] / 4 );
857857 uint8_t data[] = { (uint8_t )(RX_CMD_TX_PWR&0xFF ), (uint8_t )((RX_CMD_TX_PWR>>8 )&0xFF ), 2 ,
@@ -860,7 +860,7 @@ bool ProtoState::syncSettings()
860860 clearDirtyFlag (DC_RX_CMD_TX_PWR);
861861 return true ;
862862 }
863- if (checkDirtyFlag (DC_RX_CMD_RSSI_CHANNEL_SETUP))
863+ if (checkDirtyFlag (DC_RX_CMD_RSSI_CHANNEL_SETUP))
864864 {
865865 TRACE (" AFHDS3 [RX_CMD_RSSI_CHANNEL_SETUP]" );
866866 uint8_t data[] = { (uint8_t )(RX_CMD_RSSI_CHANNEL_SETUP&0xFF ), (uint8_t )((RX_CMD_RSSI_CHANNEL_SETUP>>8 )&0xFF ), 1 , cfg->v1 .SignalStrengthRCChannelNb };
@@ -874,49 +874,90 @@ bool ProtoState::syncSettings()
874874 trsp.putFrame (COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof (data));
875875 return true ;
876876 }
877- if (checkDirtyFlag (DC_RX_CMD_FREQUENCY_V0))
877+ if (checkDirtyFlag (DC_RX_CMD_FREQUENCY_V0))
878878 {
879879 TRACE (" AFHDS3 [RX_CMD_FREQUENCY_V0]" );
880+ uint16_t Frequency = ((cfg->v0 .PWMFrequency .Synchronized <<15 )| cfg->v0 .PWMFrequency .Frequency );
880881 uint8_t data[] = { (uint8_t )(RX_CMD_FREQUENCY_V0&0xFF ), (uint8_t )((RX_CMD_FREQUENCY_V0>>8 )&0xFF ), 2 ,
881- (uint8_t )(cfg-> v0 . PWMFrequency . Frequency &0xFF ), (uint8_t )((cfg-> v0 . PWMFrequency . Frequency >>8 )&0xFF ) };
882+ (uint8_t )(Frequency&0xFF ), (uint8_t )((Frequency>>8 )&0xFF ) };
882883 trsp.putFrame (COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof (data));
883884 return true ;
884885 }
885- if (checkDirtyFlag (DC_RX_CMD_PORT_TYPE_V1))
886+ if (checkDirtyFlag (DC_RX_CMD_PORT_TYPE_V1))
886887 {
887888 TRACE (" AFHDS3 [RX_CMD_PORT_TYPE_V1]" );
888889 uint8_t data[] = { (uint8_t )(RX_CMD_PORT_TYPE_V1&0xFF ), (uint8_t )((RX_CMD_PORT_TYPE_V1>>8 )&0xFF ), 4 , 0 , 0 , 0 , 0 };
889890 std::memcpy (&data[3 ], &cfg->v1 .NewPortTypes , SES_NPT_NB_MAX_PORTS);
890891 trsp.putFrame (COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof (data));
891892 return true ;
892893 }
893- if (checkDirtyFlag (DC_RX_CMD_FREQUENCY_V1))
894+ if (checkDirtyFlag (DC_RX_CMD_FREQUENCY_V1))
894895 {
895896 TRACE (" AFHDS3 [RX_CMD_FREQUENCY_V1]" );
896897 uint8_t data[32 + 3 + 3 ] = { (uint8_t )(RX_CMD_FREQUENCY_V1&0xFF ), (uint8_t )((RX_CMD_FREQUENCY_V1>>8 )&0xFF ), 32 +3 };
897898 data[3 ] = 0 ;
898899 std::memcpy (&data[4 ], &cfg->v1 .PWMFrequenciesV1 .PWMFrequencies [0 ], 32 );
899900 data[36 ] = cfg->v1 .PWMFrequenciesV1 .Synchronized & 0xff ;
900- data[37 ] = (cfg->v1 .PWMFrequenciesV1 .Synchronized >>8 ) & 0xff ;
901+ data[37 ] = (cfg->v1 .PWMFrequenciesV1 .Synchronized >>8 ) & 0xff ;
901902 trsp.putFrame (COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof (data));
902903 DIRTY_CMD (cfg, DC_RX_CMD_FREQUENCY_V1_2);
903904 return true ;
904905 }
905- if (checkDirtyFlag (DC_RX_CMD_FREQUENCY_V1_2))
906+ if (checkDirtyFlag (DC_RX_CMD_FREQUENCY_V1_2))
906907 {
907908 TRACE (" AFHDS3 [RX_CMD_FREQUENCY_V1_2]" );
908909 uint8_t data[32 + 3 + 3 ] = { (uint8_t )(RX_CMD_FREQUENCY_V1_2&0xFF ), (uint8_t )((RX_CMD_FREQUENCY_V1_2>>8 )&0xFF ), 32 +3 };
909910 data[3 ] = 1 ;
910911 std::memcpy (&data[4 ], &cfg->v1 .PWMFrequenciesV1 .PWMFrequencies [16 ], 32 );
911912 data[36 ] = (cfg->v1 .PWMFrequenciesV1 .Synchronized >>16 ) & 0xff ;
912- data[37 ] = (cfg->v1 .PWMFrequenciesV1 .Synchronized >>24 ) & 0xff ;
913+ data[37 ] = (cfg->v1 .PWMFrequenciesV1 .Synchronized >>24 ) & 0xff ;
913914 trsp.putFrame (COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof (data));
914915 return true ;
915916 }
916- if (checkDirtyFlag (DC_RX_CMD_BUS_TYPE_V0))
917+ if (checkDirtyFlag (DC_RX_CMD_BUS_TYPE_V0))
917918 {
918919 TRACE (" AFHDS3 [RX_CMD_BUS_TYPE_V0]" );
919- uint8_t data[] = { (uint8_t )(RX_CMD_BUS_TYPE_V0&0xFF ), (uint8_t )((RX_CMD_BUS_TYPE_V0>>8 )&0xFF ), 1 , cfg->others .ExternalBusType };
920+ bool onlySupportIBUSOut = (1 ==receiver_type (rx_version.ProductNumber ));
921+
922+ if (onlySupportIBUSOut && cfg->others .ExternalBusType == EB_BT_IBUS1_IN)
923+ {
924+ cfg->others .ExternalBusType = EB_BT_IBUS1_OUT;
925+ }
926+ uint8_t data[] = { (uint8_t )(RX_CMD_BUS_TYPE_V0&0xFF ), (uint8_t )((RX_CMD_BUS_TYPE_V0>>8 )&0xFF ), 1 ,
927+ cfg->others .ExternalBusType == EB_BT_SBUS1 ? EB_BT_SBUS1 : EB_BT_IBUS1};
928+ trsp.putFrame (COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof (data));
929+
930+ if (!onlySupportIBUSOut)
931+ {
932+ DIRTY_CMD (cfg, DC_RX_CMD_IBUS_DIRECTION);
933+ }
934+ return true ;
935+
936+ /*
937+ if(1>=cfg->others.ExternalBusType) //IBUS1
938+ {
939+ uint8_t data[] = { (uint8_t)(RX_CMD_BUS_TYPE_V0&0xFF), (uint8_t)((RX_CMD_BUS_TYPE_V0>>8)&0xFF), 1, 0 };
940+ trsp.putFrame(COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof(data));
941+ if( 1==receiver_type(rx_version.ProductNumber))
942+ {
943+ cfg->others.ExternalBusType = 0;//These RXs only support iBUS-OUT
944+ }
945+ cfg->others.iBusType = cfg->others.ExternalBusType;
946+ DIRTY_CMD(cfg, DC_RX_CMD_IBUS_DIRECTION);
947+ }
948+ else if(2==cfg->others.ExternalBusType)//SBUS
949+ {
950+ uint8_t data[] = { (uint8_t)(RX_CMD_BUS_TYPE_V0&0xFF), (uint8_t)((RX_CMD_BUS_TYPE_V0>>8)&0xFF), 1, cfg->others.ExternalBusType };
951+ trsp.putFrame(COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof(data));
952+ }
953+ return true;
954+ */
955+ }
956+ if (checkDirtyFlag (DC_RX_CMD_IBUS_DIRECTION))
957+ {
958+ TRACE (" AFHDS3 [RX_CMD_IBUS_DIRECTION]" );
959+ uint8_t data[] = { (uint8_t )(RX_CMD_IBUS_DIRECTION&0xFF ), (uint8_t )((RX_CMD_IBUS_DIRECTION>>8 )&0xFF ), 1 ,
960+ cfg->others .ExternalBusType == EB_BT_IBUS1_OUT ? EB_BT_IBUS1_OUT : EB_BT_IBUS1_IN};
920961 trsp.putFrame (COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof (data));
921962 return true ;
922963 }
@@ -1004,7 +1045,7 @@ void ProtoState::applyConfigFromModel()
10041045 cfg.v0 .EMIStandard = moduleData->afhds3 .emi ;
10051046 cfg.v0 .IsTwoWay = moduleData->afhds3 .telemetry ;
10061047 cfg.v0 .PhyMode = moduleData->afhds3 .phyMode ;
1007- cfg.v0 .ExternalBusType = cfg.others .ExternalBusType ==1 ? 0 :cfg. others . ExternalBusType ;
1048+ cfg.v0 .ExternalBusType = cfg.others .ExternalBusType ==EB_BT_SBUS1 ? EB_BT_SBUS1 : EB_BT_IBUS1 ;
10081049 // Failsafe
10091050 setFailSafe (cfg.v0 .FailSafe );
10101051 if (moduleData->failsafeMode != FAILSAFE_NOPULSES) {
0 commit comments