Skip to content

Commit 7e29fc7

Browse files
committed
fix(AFHDS3): iBus IN and Failsafe settings not updating (#3793)
1 parent 3f517e6 commit 7e29fc7

File tree

2 files changed

+65
-22
lines changed

2 files changed

+65
-22
lines changed

radio/src/pulses/afhds3.cpp

Lines changed: 57 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {

radio/src/pulses/afhds3_config.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,19 @@ enum eSES_PA_SetAnalogOutput {
3737
SES_ANALOG_OUTPUT_PPM
3838
};
3939

40-
enum eEB_BusType {
40+
enum eEB_BusType : uint8_t {
4141
EB_BT_IBUS1=0,
42+
EB_BT_IBUS1_OUT = EB_BT_IBUS1,
4243
EB_BT_IBUS2,
44+
EB_BT_IBUS1_IN = EB_BT_IBUS2,
4345
EB_BT_SBUS1
4446
};
4547

46-
typedef enum
48+
enum IBUS1_DIR
4749
{
4850
IBUS1_OUT,
49-
IBUS1_IN, //Not yet supported
50-
} eIBUS1_DIR;
51+
IBUS1_IN,
52+
};
5153

5254
// 48 bytes
5355
PACK(struct sDATA_ConfigV0 {
@@ -61,7 +63,7 @@ PACK(struct sDATA_ConfigV0 {
6163
uint8_t FailsafeOutputMode; //TRUE Or FALSE
6264
sSES_PWMFrequencyV0 PWMFrequency;
6365
uint8_t AnalogOutput; // eSES_PA_SetAnalogOutput
64-
uint8_t ExternalBusType; // eEB_BusType
66+
eEB_BusType ExternalBusType; // eEB_BusType
6567
});
6668

6769
#define SES_NB_MAX_CHANNELS (32)
@@ -129,7 +131,7 @@ PACK(struct sDATA_ConfigV1 {
129131

130132
PACK(struct sDATA_Others {
131133
uint8_t buffer[sizeof(sDATA_ConfigV1)];
132-
uint8_t ExternalBusType; // eEB_BusType
134+
uint8_t ExternalBusType; // eEB_BusType IBUS1:0;IBUS2:1(Not supported yet);SBUS:2
133135
tmr10ms_t lastUpdated; // last updated time
134136
bool isConnected; // specify if receiver is connected
135137
uint32_t dirtyFlag; // mapped to commands that need to be issued to sync settings

0 commit comments

Comments
 (0)