1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-23 16:25:16 +03:00

BIND should be OK now

This commit is contained in:
Bertrand Songis 2019-02-06 12:08:38 +01:00
parent b590a653d7
commit 5acf351d0c
4 changed files with 47 additions and 19 deletions

View file

@ -1096,6 +1096,7 @@ void opentxResume();
#else
#define SD_SCREEN_FILE_LENGTH 64
#endif
union ReusableBuffer
{
// ARM 334 bytes
@ -1116,8 +1117,10 @@ union ReusableBuffer
struct {
char msg[64];
uint8_t r9mPower;
char pxx2_candidate_receivers[5][8];
uint8_t pxx2_candidate_receivers_count;
uint8_t pxx2_register_or_bind_step;
char pxx2_bind_candidate_receivers[5][8];
uint8_t pxx2_bind_candidate_receivers_count;
uint8_t pxx2_bind_receiver_index;
} modelsetup;
// 103 bytes

View file

@ -57,11 +57,9 @@ void Pxx2Pulses::setupChannelsFrame(uint8_t module)
void Pxx2Pulses::setupRegisterFrame(uint8_t module)
{
unsigned counter = moduleSettings[module].counter;
addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER);
if (counter == REGISTER_COUNTER_ID_RECEIVED) {
if (reusableBuffer.modelsetup.pxx2_register_or_bind_step == REGISTER_COUNTER_ID_RECEIVED) {
Pxx2Transport::addByte(0x01);
for (uint8_t i=0; i<PXX2_LEN_REGISTRATION_ID; i++) {
Pxx2Transport::addByte(g_model.modelRegistrationID[i]);
@ -76,10 +74,18 @@ void Pxx2Pulses::setupBindFrame(uint8_t module)
{
addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_BIND);
if (reusableBuffer.modelsetup.pxx2_register_or_bind_step == BIND_RX_ID_SELECTED) {
Pxx2Transport::addByte(0x00);
for (uint8_t i=0; i<PXX2_LEN_RX_ID; i++) {
Pxx2Transport::addByte(g_model.moduleData[module].pxx2.receivers[reusableBuffer.modelsetup.pxx2_bind_receiver_index].rxID[i]);
}
}
else {
Pxx2Transport::addByte(0x00);
for (uint8_t i=0; i<PXX2_LEN_REGISTRATION_ID; i++) {
Pxx2Transport::addByte(g_model.modelRegistrationID[i]);
}
}
}
void Pxx2Pulses::setupFrame(uint8_t module)

View file

@ -26,8 +26,6 @@
#define PXX2_TYPE_C_MODULE 0x01
#define PXX2_TYPE_ID_REGISTER 0x01
#define REGISTER_COUNTER_ID_RECEIVED 1001
#define REGISTER_COUNTER_PASSWORD_RECEIVED 1002
#define PXX2_TYPE_ID_BIND 0x02
#define PXX2_TYPE_ID_CHANNELS 0x03
#define PXX2_TYPE_ID_SPORT 0xFE
@ -38,8 +36,21 @@
#define PXX2_FLAG0_FAILSAFE (1 << 6)
const uint8_t DEFAULT_CHANNEL_MAPPING[] = {0x12, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
const uint8_t CH9TO16_CHANNEL_MAPPING[] = {0x89, 0xAB, 0xCD, 0xEF, 0x12, 0x23, 0x45, 0x67};
const uint8_t DEFAULT_CHANNEL_MAPPING[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
const uint8_t CH9TO16_CHANNEL_MAPPING[] = {0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67};
enum PXX2RegisterSteps {
REGISTER_START,
REGISTER_COUNTER_ID_RECEIVED,
REGISTER_OK
};
enum PXX2BindSteps {
BIND_START,
BIND_RX_ID_RECEIVED,
BIND_RX_ID_SELECTED,
BIND_OK
};
class ModuleFifo : public Fifo<uint8_t, 32> {
public:

View file

@ -76,12 +76,13 @@ void processRegisterFrame(uint8_t module, uint8_t * frame)
{
if (frame[3] == 0x00) {
// RX_ID follows, we discard it for now
moduleSettings[module].counter = REGISTER_COUNTER_ID_RECEIVED;
reusableBuffer.modelsetup.pxx2_register_or_bind_step = REGISTER_COUNTER_ID_RECEIVED;
}
else if (frame[3] == 0x01) {
// PASSWORD follows, we check it is good
if (memcmp(&frame[4], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) {
moduleSettings[module].counter = REGISTER_COUNTER_PASSWORD_RECEIVED;
reusableBuffer.modelsetup.pxx2_register_or_bind_step = REGISTER_OK;
moduleSettings[module].mode = MODULE_MODE_NORMAL;
}
}
}
@ -90,15 +91,22 @@ void processBindFrame(uint8_t module, uint8_t * frame)
{
if (frame[3] == 0x00) {
bool found = false;
for (uint8_t i=0; i<reusableBuffer.modelsetup.pxx2_candidate_receivers_count; i++) {
if (memcmp(reusableBuffer.modelsetup.pxx2_candidate_receivers[i], &frame[4], PXX2_LEN_RX_ID) == 0) {
for (uint8_t i=0; i<reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count; i++) {
if (memcmp(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers[i], &frame[4], PXX2_LEN_RX_ID) == 0) {
found = true;
break;
}
}
if (!found && reusableBuffer.modelsetup.pxx2_candidate_receivers_count < PXX2_MAX_RECEIVERS_PER_MODULE) {
memcpy(reusableBuffer.modelsetup.pxx2_candidate_receivers[reusableBuffer.modelsetup.pxx2_candidate_receivers_count], &frame[4], PXX2_LEN_RX_ID);
++reusableBuffer.modelsetup.pxx2_candidate_receivers_count;
if (!found && reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count < PXX2_MAX_RECEIVERS_PER_MODULE) {
memcpy(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers[reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count], &frame[4], PXX2_LEN_RX_ID);
++reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count;
reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_RX_ID_RECEIVED;
}
}
else if (frame[3] == 0x01) {
if (memcmp(g_model.moduleData[module].pxx2.receivers[reusableBuffer.modelsetup.pxx2_bind_receiver_index].rxID, &frame[4], PXX2_LEN_RX_ID) == 0) {
reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_OK;
moduleSettings[module].mode = MODULE_MODE_NORMAL;
}
}
}