Model Setup refactoring
This commit is contained in:
+4
-32
@@ -415,14 +415,6 @@ PACK(struct TrainerModuleData {
|
||||
uint8_t pulsePol:1;
|
||||
});
|
||||
|
||||
/*
|
||||
* Receiver structure
|
||||
*/
|
||||
|
||||
PACK(struct ReceiverData {
|
||||
char name[PXX2_LEN_RX_NAME];
|
||||
});
|
||||
|
||||
/*
|
||||
* Module structure
|
||||
*/
|
||||
@@ -478,26 +470,8 @@ PACK(struct ModuleData {
|
||||
int8_t refreshRate; // definition as framelength for ppm (* 5 + 225 = time in 1/10 ms)
|
||||
} sbus);
|
||||
NOBACKUP(PACK(struct {
|
||||
uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W
|
||||
uint8_t external_antenna:1; // false = internal antenna, true = external antenna
|
||||
#if defined(PCBHORUS)
|
||||
uint8_t spare:5;
|
||||
uint32_t receivers; // max 5 receivers per module and 10 receivers in total (4bits per receiver with 0 = unused)
|
||||
#else
|
||||
uint8_t spare:1;
|
||||
uint16_t receivers:12; // max 4 receivers per module and 4 receivers in total (3bits per receiver with 0 = unused)
|
||||
#endif
|
||||
NOBACKUP(inline uint8_t getReceiverSlot(uint8_t receiver) {
|
||||
return (receivers >> (3 * receiver)) & 0b111;
|
||||
})
|
||||
|
||||
NOBACKUP(inline void setReceiverSlot(uint8_t receiver, uint8_t slot) {
|
||||
receivers = BF_SET<uint16_t>(receivers, slot, 3 * receiver, 3);
|
||||
})
|
||||
|
||||
NOBACKUP(inline void clearReceiverSlot(uint8_t receiver) {
|
||||
setReceiverSlot(receiver, 0);
|
||||
})
|
||||
uint8_t receivers; // 5 bits spare
|
||||
char receiverName[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME];
|
||||
}) pxx2);
|
||||
};
|
||||
|
||||
@@ -617,7 +591,6 @@ PACK(struct ModelData {
|
||||
NOBACKUP(uint8_t spare1:6);
|
||||
NOBACKUP(uint8_t potsWarnMode:2);
|
||||
ModuleData moduleData[NUM_MODULES];
|
||||
ReceiverData receiverData[NUM_RECEIVERS];
|
||||
int16_t failsafeChannels[MAX_OUTPUT_CHANNELS];
|
||||
TrainerModuleData trainerData;
|
||||
|
||||
@@ -802,7 +775,6 @@ PACK(struct RadioData {
|
||||
NOBACKUP(int8_t varioPitch);
|
||||
NOBACKUP(int8_t varioRange);
|
||||
NOBACKUP(int8_t varioRepeat);
|
||||
|
||||
CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS];
|
||||
|
||||
EXTRA_GENERAL_FIELDS
|
||||
@@ -931,7 +903,7 @@ static inline void check_struct()
|
||||
#if defined(PCBHORUS)
|
||||
CHKSIZE(ModuleData, 9);
|
||||
#else
|
||||
CHKSIZE(ModuleData, 6);
|
||||
CHKSIZE(ModuleData, 29);
|
||||
#endif
|
||||
|
||||
CHKSIZE(GVarData, 7);
|
||||
@@ -941,7 +913,7 @@ static inline void check_struct()
|
||||
|
||||
#if defined(PCBXLITES)
|
||||
CHKSIZE(RadioData, 860);
|
||||
CHKSIZE(ModelData, 6040);
|
||||
CHKSIZE(ModelData, 6054);
|
||||
#elif defined(PCBXLITE)
|
||||
CHKSIZE(RadioData, 852);
|
||||
CHKSIZE(ModelData, 6040);
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#define RECEIVER_OPTIONS_2ND_COLUMN 80
|
||||
|
||||
extern uint8_t g_moduleIdx;
|
||||
extern void drawReceiverName(uint8_t x, uint8_t y, uint8_t receiverSlot);
|
||||
extern void drawReceiverName(uint8_t x, uint8_t y, uint8_t moduleIndex, uint8_t receiverIndex, LcdFlags flags=0);
|
||||
|
||||
void onRxOptionsUpdateConfirm(const char * result)
|
||||
{
|
||||
@@ -95,7 +95,7 @@ void menuModelReceiverOptions(event_t event)
|
||||
|
||||
int8_t sub = menuVerticalPosition;
|
||||
lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS);
|
||||
drawReceiverName(FW * 13, 0, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId);
|
||||
drawReceiverName(FW * 13, 0, g_moduleIdx, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId);
|
||||
lcdInvertLine(0);
|
||||
|
||||
if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) {
|
||||
|
||||
@@ -27,15 +27,14 @@
|
||||
#define EVT_BUTTON_PRESSED() EVT_KEY_BREAK(KEY_ENTER)
|
||||
#endif
|
||||
|
||||
// TODO can be moved to reusableBuffer
|
||||
uint8_t g_moduleIdx;
|
||||
|
||||
void drawReceiverName(uint8_t x, uint8_t y, uint8_t receiverSlot)
|
||||
void drawReceiverName(uint8_t x, uint8_t y, uint8_t moduleIdx, uint8_t receiverIdx, LcdFlags flags=0)
|
||||
{
|
||||
if (g_model.receiverData[receiverSlot].name[0] != '\0')
|
||||
lcdDrawSizedText(x, y, g_model.receiverData[receiverSlot].name, PXX2_LEN_RX_NAME);
|
||||
if (g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx][0] != '\0')
|
||||
lcdDrawSizedText(x, y, g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME, flags);
|
||||
else
|
||||
lcdDrawText(x, y, "---");
|
||||
lcdDrawText(x, y, "---", flags);
|
||||
}
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
@@ -98,15 +97,9 @@ enum MenuModelSetupItems {
|
||||
ITEM_MODEL_INTERNAL_MODULE_FAILSAFE,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_REGISTER_RANGE,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_OPTIONS,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_LABEL,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_LABEL,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2,
|
||||
ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3,
|
||||
#endif
|
||||
ITEM_MODEL_EXTERNAL_MODULE_LABEL,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_MODE,
|
||||
@@ -132,15 +125,9 @@ enum MenuModelSetupItems {
|
||||
ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_REGISTER_RANGE,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_OPTIONS,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_LABEL,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2,
|
||||
ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3,
|
||||
#if defined(PCBSKY9X) && !defined(REVA)
|
||||
ITEM_MODEL_EXTRA_MODULE_LABEL,
|
||||
ITEM_MODEL_EXTRA_MODULE_CHANNELS,
|
||||
@@ -177,11 +164,10 @@ enum MenuModelSetupItems {
|
||||
|
||||
#define IF_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? (uint8_t)(xxx) : HIDDEN_ROW)
|
||||
#define IF_NOT_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? HIDDEN_ROW : (uint8_t)(xxx))
|
||||
#define IF_PXX2_RECEIVER_DISPLAYED(module, idx, xxx) ((isModulePXX2(module) && g_model.moduleData[module].pxx2.getReceiverSlot(idx)) ? (uint8_t)(xxx) : HIDDEN_ROW)
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)
|
||||
#define CURRENT_RECEIVER_EDITED(k) ((k - (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL : ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL)) / (ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL))
|
||||
#define CURRENT_RECEIVER_EDITED(k) (k - (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1 : ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1))
|
||||
#elif defined(PCBSKY9X) && !defined(REVA)
|
||||
#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE)
|
||||
#else
|
||||
@@ -272,14 +258,45 @@ void onPXX2BindMenu(const char * result)
|
||||
}
|
||||
else {
|
||||
// the user pressed [Exit]
|
||||
uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition);
|
||||
uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE);
|
||||
moduleSettings[moduleIdx].mode = MODULE_MODE_NORMAL;
|
||||
}
|
||||
}
|
||||
|
||||
const char * STR_BIND = "Bind";
|
||||
const char * STR_SHARE = "Share";
|
||||
|
||||
void onPXX2ReceiverMenu(const char * result)
|
||||
{
|
||||
uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE);
|
||||
uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(menuVerticalPosition - HEADER_LINE);
|
||||
|
||||
if (result == STR_OPTIONS) {
|
||||
memclear(&reusableBuffer.hardwareAndSettings, sizeof(reusableBuffer.hardwareAndSettings));
|
||||
reusableBuffer.hardwareAndSettings.receiverSettings.receiverId = receiverIdx;
|
||||
pushMenu(menuModelReceiverOptions);
|
||||
}
|
||||
else if (result == STR_BIND) {
|
||||
memclear(&reusableBuffer.moduleSetup.pxx2, sizeof(reusableBuffer.moduleSetup.pxx2));
|
||||
reusableBuffer.moduleSetup.pxx2.bindReceiverIndex = receiverIdx;
|
||||
moduleSettings[moduleIdx].mode = MODULE_MODE_BIND;
|
||||
s_editMode = 1;
|
||||
}
|
||||
else if (result == STR_SHARE) {
|
||||
reusableBuffer.moduleSetup.pxx2.shareReceiverIndex = receiverIdx;
|
||||
moduleSettings[moduleIdx].mode = MODULE_MODE_SHARE;
|
||||
s_editMode = 1;
|
||||
}
|
||||
else if (result == STR_DELETE) {
|
||||
g_model.moduleData[moduleIdx].pxx2.receivers &= ~(1 << receiverIdx);
|
||||
memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME);
|
||||
storageDirty(EE_MODEL);
|
||||
}
|
||||
}
|
||||
|
||||
void onBindMenu(const char * result)
|
||||
{
|
||||
uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition);
|
||||
uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE);
|
||||
|
||||
if (result == STR_BINDING_1_8_TELEM_ON) {
|
||||
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
|
||||
@@ -398,30 +415,6 @@ inline bool isDefaultModelRegistrationID()
|
||||
return memcmp(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0;
|
||||
}
|
||||
|
||||
uint8_t findEmptyReceiverSlot()
|
||||
{
|
||||
for (uint8_t slot = 1; slot <= NUM_RECEIVERS; slot++) {
|
||||
bool used = false;
|
||||
for (uint8_t module = 0; module < NUM_MODULES; module++) {
|
||||
if (isModulePXX2(module)) {
|
||||
for (uint8_t receiver = 0; receiver < PXX2_MAX_RECEIVERS_PER_MODULE; receiver++) {
|
||||
if (g_model.moduleData[module].pxx2.getReceiverSlot(receiver) == slot) {
|
||||
used = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (used) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!used) {
|
||||
return slot;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void menuModelSetup(event_t event)
|
||||
{
|
||||
#if defined(EXTERNAL_ANTENNA)
|
||||
@@ -469,15 +462,9 @@ void menuModelSetup(event_t event)
|
||||
IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Module start channel
|
||||
IF_PXX2_MODULE(INTERNAL_MODULE, 1), // Range check and Register buttons
|
||||
IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Module options
|
||||
IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver Name + Add/Del buttons
|
||||
IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Pinmap
|
||||
IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Share
|
||||
IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver2 Name + Add/Del buttons
|
||||
IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver2 Pinmap
|
||||
IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 1), // Receiver2 Bind/Share
|
||||
IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver3 Name + Add/Del buttons
|
||||
IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 2, 0), // Receiver3 Pinmap
|
||||
IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 2, 1), // Receiver3 Bind/Share
|
||||
IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver 1
|
||||
IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver 2
|
||||
IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver 3
|
||||
|
||||
LABEL(ExternalModule),
|
||||
EXTERNAL_MODULE_MODE_ROWS,
|
||||
@@ -494,16 +481,9 @@ void menuModelSetup(event_t event)
|
||||
FAILSAFE_ROWS(EXTERNAL_MODULE),
|
||||
IF_PXX2_MODULE(EXTERNAL_MODULE, 1), // Range check and Register buttons
|
||||
IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Module options
|
||||
IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Receiver Name + Add/Del buttons
|
||||
IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Pinmap
|
||||
IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 1), // Receiver Bind/Share
|
||||
IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver2 Name + Add/Del buttons
|
||||
IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver2 Range
|
||||
IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 1), // Receiver2 Bind/Share
|
||||
IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver3 Name + Add/Del buttons
|
||||
IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 2, 0), // Receiver3 Pinmap
|
||||
IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 2, 1), // Receiver3 Bind/Share
|
||||
|
||||
IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Receiver 1
|
||||
IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Receiver 2
|
||||
IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Receiver 3
|
||||
TRAINER_ROWS
|
||||
});
|
||||
#else
|
||||
@@ -1270,45 +1250,6 @@ void menuModelSetup(event_t event)
|
||||
}
|
||||
break;
|
||||
|
||||
case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL:
|
||||
case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_LABEL:
|
||||
case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_LABEL:
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL:
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL:
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_LABEL:
|
||||
{
|
||||
uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k);
|
||||
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
|
||||
uint8_t receiverSlot = g_model.moduleData[moduleIdx].pxx2.getReceiverSlot(receiverIdx);
|
||||
|
||||
lcdDrawTextAlignedLeft(y, STR_RECEIVER);
|
||||
lcdDrawNumber(lcdLastRightPos + 1, y, receiverIdx + 1);
|
||||
|
||||
if (receiverSlot) {
|
||||
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DEL_BUTTON, attr);
|
||||
if (attr && s_editMode > 0) {
|
||||
g_model.moduleData[moduleIdx].pxx2.receivers = (g_model.moduleData[moduleIdx].pxx2.receivers & BF_MASK<uint16_t>(0, receiverIdx * 3)) | ((g_model.moduleData[moduleIdx].pxx2.receivers & BF_MASK<uint16_t>((receiverIdx + 1) * 3, (PXX2_MAX_RECEIVERS_PER_MODULE - 1 - receiverIdx) * 3)) >> 3);
|
||||
memclear(&g_model.receiverData[receiverSlot - 1], sizeof(ReceiverData));
|
||||
s_editMode = 0;
|
||||
killEvents(event);
|
||||
storageDirty(EE_MODEL);
|
||||
}
|
||||
}
|
||||
else {
|
||||
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_RXADD_BUTTON, attr);
|
||||
if (attr && s_editMode > 0) {
|
||||
s_editMode = 0;
|
||||
killEvents(event);
|
||||
uint8_t slot = findEmptyReceiverSlot();
|
||||
if (slot > 0) {
|
||||
g_model.moduleData[moduleIdx].pxx2.receivers |= (slot << (receiverIdx * 3));
|
||||
storageDirty(EE_MODEL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ITEM_MODEL_INTERNAL_MODULE_PXX2_OPTIONS:
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_PXX2_OPTIONS:
|
||||
lcdDrawText(INDENT_WIDTH, y, STR_OPTIONS);
|
||||
@@ -1320,79 +1261,65 @@ void menuModelSetup(event_t event)
|
||||
}
|
||||
break;
|
||||
|
||||
case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS:
|
||||
case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS:
|
||||
case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS:
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS:
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS:
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS:
|
||||
lcdDrawText(INDENT_WIDTH * 2, y, STR_OPTIONS);
|
||||
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_SET, attr);
|
||||
if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) {
|
||||
g_moduleIdx = CURRENT_MODULE_EDITED(k);
|
||||
uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k);
|
||||
uint8_t receiverSlot = g_model.moduleData[g_moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1;
|
||||
memclear(&reusableBuffer.hardwareAndSettings, sizeof(reusableBuffer.hardwareAndSettings));
|
||||
reusableBuffer.hardwareAndSettings.receiverSettings.receiverId = receiverSlot;
|
||||
pushMenu(menuModelReceiverOptions);
|
||||
}
|
||||
break;
|
||||
|
||||
case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE:
|
||||
case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE:
|
||||
case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE:
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE:
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE:
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE:
|
||||
case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1:
|
||||
case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2:
|
||||
case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3:
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1:
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2:
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3:
|
||||
{
|
||||
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
|
||||
uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k);
|
||||
uint8_t receiverSlot = g_model.moduleData[moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1;
|
||||
|
||||
drawReceiverName(INDENT_WIDTH * 2, y, receiverSlot);
|
||||
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, menuHorizontalPosition==0 ? attr : 0);
|
||||
lcdDrawText(lcdLastRightPos + FW/2, y, STR_BUTTON_SHARE, menuHorizontalPosition==1 ? attr : 0);
|
||||
drawStringWithIndex(INDENT_WIDTH, y, STR_RECEIVER, receiverIdx + 1);
|
||||
|
||||
if (attr) {
|
||||
if (menuHorizontalPosition == 0) {
|
||||
if (event == EVT_KEY_BREAK(KEY_ENTER)) {
|
||||
// TODO this will go to module.cpp
|
||||
memclear(&reusableBuffer.moduleSetup.pxx2, sizeof(reusableBuffer.moduleSetup.pxx2));
|
||||
reusableBuffer.moduleSetup.pxx2.bindReceiverId = receiverSlot;
|
||||
moduleSettings[moduleIdx].mode ^= MODULE_MODE_BIND;
|
||||
}
|
||||
else if (event == EVT_KEY_BREAK(KEY_EXIT)) {
|
||||
moduleSettings[moduleIdx].mode &= ~MODULE_MODE_BIND;
|
||||
}
|
||||
if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) {
|
||||
s_editMode = 1;
|
||||
if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_START && reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount > 0) {
|
||||
popupMenuItemsCount = min<uint8_t>(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE);
|
||||
for (uint8_t i=0; i<popupMenuItemsCount; i++) {
|
||||
popupMenuItems[i] = reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[i];
|
||||
}
|
||||
popupMenuTitle = "Select RX...";
|
||||
POPUP_MENU_START(onPXX2BindMenu);
|
||||
}
|
||||
}
|
||||
else {
|
||||
s_editMode = 0;
|
||||
}
|
||||
if (!(g_model.moduleData[moduleIdx].pxx2.receivers & (1 << receiverIdx))) {
|
||||
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, BUTTON("Add"), attr);
|
||||
if (attr && s_editMode > 0) {
|
||||
s_editMode = 0;
|
||||
killEvents(event);
|
||||
g_model.moduleData[moduleIdx].pxx2.receivers |= (1 << receiverIdx);
|
||||
storageDirty(EE_MODEL);
|
||||
}
|
||||
else {
|
||||
// for now we will send the SHARE frame indefinitely (until the user manually stops it)
|
||||
if (event == EVT_KEY_BREAK(KEY_ENTER)) {
|
||||
moduleSettings[moduleIdx].mode ^= MODULE_MODE_SHARE;
|
||||
reusableBuffer.moduleSetup.pxx2.shareReceiverId = receiverSlot;
|
||||
}
|
||||
else if (event == EVT_KEY_BREAK(KEY_EXIT)) {
|
||||
moduleSettings[moduleIdx].mode &= ~MODULE_MODE_SHARE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
drawReceiverName(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, receiverIdx, attr);
|
||||
|
||||
if (attr && (moduleSettings[moduleIdx].mode == 0 || s_editMode == 0)) {
|
||||
if (moduleSettings[moduleIdx].mode) {
|
||||
moduleSettings[moduleIdx].mode = 0;
|
||||
killEvents(event); // we stopped BIND / SHARE, we don't want to re-open the menu
|
||||
event = 0;
|
||||
}
|
||||
s_editMode = 0;
|
||||
}
|
||||
|
||||
if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) {
|
||||
if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_START && reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount > 0) {
|
||||
popupMenuItemsCount = min<uint8_t>(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE);
|
||||
for (uint8_t i=0; i<popupMenuItemsCount; i++) {
|
||||
popupMenuItems[i] = reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[i];
|
||||
}
|
||||
popupMenuTitle = "Select RX...";
|
||||
POPUP_MENU_START(onPXX2BindMenu);
|
||||
}
|
||||
}
|
||||
|
||||
if (attr && EVT_KEY_MASK(event) == KEY_ENTER) {
|
||||
killEvents(event);
|
||||
POPUP_MENU_ADD_ITEM(STR_OPTIONS);
|
||||
POPUP_MENU_ADD_ITEM(STR_BIND);
|
||||
POPUP_MENU_ADD_ITEM(STR_SHARE);
|
||||
POPUP_MENU_ADD_ITEM(STR_DELETE);
|
||||
POPUP_MENU_START(onPXX2ReceiverMenu);
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if defined(PCBSKY9X)
|
||||
case ITEM_MODEL_EXTRA_MODULE_BIND:
|
||||
#endif
|
||||
@@ -1812,21 +1739,21 @@ void menuModelSetup(event_t event)
|
||||
if (old_editMode > 0 && s_editMode == 0) {
|
||||
switch(menuVerticalPosition) {
|
||||
#if defined(PCBTARANIS)
|
||||
case ITEM_MODEL_INTERNAL_MODULE_NPXX2_BIND:
|
||||
if (menuHorizontalPosition == 0)
|
||||
checkModelIdUnique(g_eeGeneral.currModel, INTERNAL_MODULE);
|
||||
break;
|
||||
case ITEM_MODEL_INTERNAL_MODULE_NPXX2_BIND:
|
||||
if (menuHorizontalPosition == 0)
|
||||
checkModelIdUnique(g_eeGeneral.currModel, INTERNAL_MODULE);
|
||||
break;
|
||||
#endif
|
||||
#if defined(PCBSKY9X)
|
||||
case ITEM_MODEL_EXTRA_MODULE_BIND:
|
||||
if (menuHorizontalPosition == 0)
|
||||
checkModelIdUnique(g_eeGeneral.currModel, EXTRA_MODULE);
|
||||
break;
|
||||
case ITEM_MODEL_EXTRA_MODULE_BIND:
|
||||
if (menuHorizontalPosition == 0)
|
||||
checkModelIdUnique(g_eeGeneral.currModel, EXTRA_MODULE);
|
||||
break;
|
||||
#endif
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_NPXX2_BIND:
|
||||
if (menuHorizontalPosition == 0)
|
||||
checkModelIdUnique(g_eeGeneral.currModel, EXTERNAL_MODULE);
|
||||
break;
|
||||
if (menuHorizontalPosition == 0)
|
||||
checkModelIdUnique(g_eeGeneral.currModel, EXTERNAL_MODULE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -420,25 +420,6 @@ When called without parameters, it will only return the status of the output buf
|
||||
@status current Introduced in 2.2.0
|
||||
*/
|
||||
|
||||
TelemetryEndpoint getTelemetryEndpoint(uint8_t receiverIndex)
|
||||
{
|
||||
TelemetryEndpoint result;
|
||||
|
||||
for (uint8_t module=0; module<NUM_MODULES; module++) {
|
||||
for (uint8_t receiver=0; receiver<PXX2_MAX_RECEIVERS_PER_MODULE; receiver++) {
|
||||
uint8_t candidateIndex = g_model.moduleData[module].pxx2.getReceiverSlot(receiver) - 1;
|
||||
if (candidateIndex == receiverIndex) {
|
||||
result.module = module;
|
||||
result.rxUid = candidateIndex;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result.value = TELEMETRY_ENDPOINT_NONE;
|
||||
return result;
|
||||
}
|
||||
|
||||
static int luaSportTelemetryPush(lua_State * L)
|
||||
{
|
||||
if (lua_gettop(L) == 0) {
|
||||
@@ -459,16 +440,14 @@ static int luaSportTelemetryPush(lua_State * L)
|
||||
packet.dataId = dataId;
|
||||
packet.value = luaL_checkunsigned(L, 4);
|
||||
outputTelemetryBuffer.pushSportPacketWithBytestuffing(packet);
|
||||
outputTelemetryBuffer.setDestination(TELEMETRY_ENDPOINT_SPORT);
|
||||
}
|
||||
else {
|
||||
outputTelemetryBuffer.sport.physicalId = getDataId(luaL_checkunsigned(L, 1));
|
||||
outputTelemetryBuffer.sport.primId = luaL_checkunsigned(L, 2);
|
||||
outputTelemetryBuffer.sport.dataId = dataId;
|
||||
outputTelemetryBuffer.sport.value = luaL_checkunsigned(L, 4);
|
||||
TelemetryEndpoint destination = getTelemetryEndpoint(sensor.frskyInstance.rxIndex);
|
||||
outputTelemetryBuffer.setDestination(destination.value);
|
||||
}
|
||||
outputTelemetryBuffer.setDestination(sensor.frskyInstance.rxIndex);
|
||||
lua_pushboolean(L, true);
|
||||
return 1;
|
||||
}
|
||||
|
||||
+2
-2
@@ -1130,10 +1130,10 @@ union ReusableBuffer
|
||||
uint8_t registerModuleIndex;
|
||||
char bindCandidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME + 1];
|
||||
uint8_t bindCandidateReceiversCount;
|
||||
uint8_t bindReceiverId;
|
||||
uint8_t bindReceiverIndex;
|
||||
union {
|
||||
uint8_t bindSelectedReceiverIndex;
|
||||
uint8_t shareReceiverId;
|
||||
uint8_t shareReceiverIndex;
|
||||
};
|
||||
} pxx2;
|
||||
};
|
||||
|
||||
@@ -122,7 +122,7 @@ void Pxx2Pulses::setupChannelsFrame(uint8_t module)
|
||||
void Pxx2Pulses::setupTelemetryFrame(uint8_t module)
|
||||
{
|
||||
addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_TELEMETRY);
|
||||
Pxx2Transport::addByte(outputTelemetryBuffer.destination.rxUid);
|
||||
Pxx2Transport::addByte(outputTelemetryBuffer.destination & 0x03);
|
||||
for (uint8_t i = 0; i < sizeof(SportTelemetryPacket); i++) {
|
||||
Pxx2Transport::addByte(outputTelemetryBuffer.data[i]);
|
||||
}
|
||||
@@ -234,7 +234,7 @@ void Pxx2Pulses::setupBindFrame(uint8_t module)
|
||||
for (uint8_t i=0; i<PXX2_LEN_RX_NAME; i++) {
|
||||
Pxx2Transport::addByte(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex][i]);
|
||||
}
|
||||
Pxx2Transport::addByte(reusableBuffer.moduleSetup.pxx2.bindReceiverId); // RX_UID is the slot index (which is unique and never moved)
|
||||
Pxx2Transport::addByte(reusableBuffer.moduleSetup.pxx2.bindReceiverIndex); // RX_UID is the slot index (which is unique and never moved)
|
||||
Pxx2Transport::addByte(g_model.header.modelId[module]);
|
||||
}
|
||||
else {
|
||||
@@ -280,7 +280,7 @@ void Pxx2Pulses::setupPowerMeter(uint8_t module)
|
||||
void Pxx2Pulses::setupShareMode(uint8_t module)
|
||||
{
|
||||
addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_SHARE);
|
||||
Pxx2Transport::addByte(reusableBuffer.moduleSetup.pxx2.shareReceiverId);
|
||||
Pxx2Transport::addByte(reusableBuffer.moduleSetup.pxx2.shareReceiverIndex);
|
||||
}
|
||||
|
||||
void Pxx2Pulses::setupFrame(uint8_t module)
|
||||
@@ -313,7 +313,7 @@ void Pxx2Pulses::setupFrame(uint8_t module)
|
||||
setupShareMode(module);
|
||||
break;
|
||||
default:
|
||||
if (outputTelemetryBuffer.destination.module == module) {
|
||||
if (outputTelemetryBuffer.destination == module) {
|
||||
setupTelemetryFrame(module);
|
||||
outputTelemetryBuffer.reset();
|
||||
}
|
||||
|
||||
@@ -158,7 +158,7 @@ extern "C" void TELEMETRY_USART_IRQHandler(void)
|
||||
#if defined(LUA)
|
||||
if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) {
|
||||
static uint8_t prevdata;
|
||||
if (prevdata == 0x7E && outputTelemetryBuffer.destination.value == TELEMETRY_ENDPOINT_SPORT && data == outputTelemetryBuffer.sport.physicalId) {
|
||||
if (prevdata == 0x7E && outputTelemetryBuffer.destination == TELEMETRY_ENDPOINT_SPORT && data == outputTelemetryBuffer.sport.physicalId) {
|
||||
sportSendBuffer(outputTelemetryBuffer.data, outputTelemetryBuffer.size);
|
||||
}
|
||||
prevdata = data;
|
||||
|
||||
+2
-6
@@ -133,13 +133,9 @@ TASK_FUNCTION(mixerTask)
|
||||
}
|
||||
#endif
|
||||
|
||||
uint32_t now = RTOS_GET_TIME();
|
||||
uint32_t now = RTOS_GET_MS();
|
||||
bool run = false;
|
||||
#if !defined(SIMU) && defined(STM32)
|
||||
if ((now - lastRunTime) >= (usbStarted() ? 5 : 10)) { // run at least every 20ms (every 10ms if USB is active)
|
||||
#else
|
||||
if ((now - lastRunTime) >= 10) { // run at least every 20ms
|
||||
#endif
|
||||
if ((now - lastRunTime) >= 10) { // run at least every 10ms
|
||||
run = true;
|
||||
}
|
||||
else if (now == nextMixerTime[0]) {
|
||||
|
||||
@@ -154,7 +154,7 @@ void processBindFrame(uint8_t module, uint8_t * frame)
|
||||
case 0x01:
|
||||
if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_RX_NAME_SELECTED) {
|
||||
if (memcmp(&reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex], &frame[4], PXX2_LEN_RX_NAME) == 0) {
|
||||
memcpy(g_model.receiverData[reusableBuffer.moduleSetup.pxx2.bindReceiverId].name, &frame[4], PXX2_LEN_RX_NAME);
|
||||
memcpy(g_model.moduleData[module].pxx2.receiverName[reusableBuffer.moduleSetup.pxx2.bindReceiverIndex], &frame[4], PXX2_LEN_RX_NAME);
|
||||
storageDirty(EE_MODEL);
|
||||
reusableBuffer.moduleSetup.pxx2.bindStep = BIND_WAIT;
|
||||
reusableBuffer.moduleSetup.pxx2.bindWaitTimeout = get_tmr10ms() + 30;
|
||||
@@ -166,10 +166,8 @@ void processBindFrame(uint8_t module, uint8_t * frame)
|
||||
|
||||
void processTelemetryFrame(uint8_t module, uint8_t * frame)
|
||||
{
|
||||
TelemetryEndpoint origin;
|
||||
origin.module = module;
|
||||
origin.rxUid = frame[3] & 0x0F;
|
||||
sportProcessTelemetryPacketWithoutCrc(origin.value, &frame[4]);
|
||||
uint8_t origin = (module << 2) + (frame[3] & 0x03);
|
||||
sportProcessTelemetryPacketWithoutCrc(origin, &frame[4]);
|
||||
}
|
||||
|
||||
void processSpectrumAnalyserFrame(uint8_t module, uint8_t * frame)
|
||||
|
||||
@@ -150,16 +150,15 @@ void sportProcessTelemetryPacket(const uint8_t * packet)
|
||||
sportProcessTelemetryPacketWithoutCrc(TELEMETRY_ENDPOINT_SPORT, packet);
|
||||
}
|
||||
|
||||
void sportProcessTelemetryPacketWithoutCrc(uint8_t originValue, const uint8_t * packet)
|
||||
void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packet)
|
||||
{
|
||||
TelemetryEndpoint & origin = (TelemetryEndpoint &)originValue;
|
||||
uint8_t physicalId = packet[0] & 0x1F;
|
||||
uint8_t primId = packet[1];
|
||||
uint16_t dataId = *((uint16_t *)(packet+2));
|
||||
uint32_t data = SPORT_DATA_S32(packet);
|
||||
|
||||
if (primId == DATA_FRAME) {
|
||||
uint8_t instance = physicalId + (origin.rxUid << 5);
|
||||
uint8_t instance = physicalId + (origin << 5);
|
||||
if (dataId == RSSI_ID && isValidIdAndInstance(RSSI_ID, instance)) {
|
||||
telemetryStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected
|
||||
data = SPORT_DATA_U8(packet);
|
||||
|
||||
@@ -158,14 +158,6 @@ void logTelemetryWriteByte(uint8_t data);
|
||||
#define TELEMETRY_ENDPOINT_NONE 0xFF
|
||||
#define TELEMETRY_ENDPOINT_SPORT 0x07
|
||||
|
||||
union TelemetryEndpoint {
|
||||
PACK(struct {
|
||||
uint8_t module:4;
|
||||
uint8_t rxUid:4;
|
||||
});
|
||||
uint8_t value;
|
||||
};
|
||||
|
||||
class OutputTelemetryBuffer {
|
||||
public:
|
||||
OutputTelemetryBuffer()
|
||||
@@ -175,7 +167,7 @@ class OutputTelemetryBuffer {
|
||||
|
||||
void setDestination(uint8_t value)
|
||||
{
|
||||
destination.value = value;
|
||||
destination = value;
|
||||
timeout = 200; /* 2s */
|
||||
}
|
||||
|
||||
@@ -189,14 +181,14 @@ class OutputTelemetryBuffer {
|
||||
|
||||
void reset()
|
||||
{
|
||||
destination.value = TELEMETRY_ENDPOINT_NONE;
|
||||
destination = TELEMETRY_ENDPOINT_NONE;
|
||||
size = 0;
|
||||
timeout = 0;
|
||||
}
|
||||
|
||||
bool isAvailable()
|
||||
{
|
||||
return destination.value == TELEMETRY_ENDPOINT_NONE;
|
||||
return destination == TELEMETRY_ENDPOINT_NONE;
|
||||
}
|
||||
|
||||
void pushByte(uint8_t byte)
|
||||
@@ -237,7 +229,7 @@ class OutputTelemetryBuffer {
|
||||
};
|
||||
uint8_t size;
|
||||
uint8_t timeout;
|
||||
TelemetryEndpoint destination;
|
||||
uint8_t destination;
|
||||
};
|
||||
|
||||
extern OutputTelemetryBuffer outputTelemetryBuffer __DMA;
|
||||
|
||||
@@ -775,7 +775,7 @@
|
||||
#define TR_MONITOR_OUTPUT_DESC "Outputs"
|
||||
#define TR_MONITOR_MIXER_DESC "Mixers"
|
||||
#define TR_RECEIVER_NUM TR(INDENT "RxNum", INDENT "Receiver No.")
|
||||
#define TR_RECEIVER INDENT "Receiver"
|
||||
#define TR_RECEIVER "Receiver"
|
||||
#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune")
|
||||
#define TR_MULTI_TELEMETRY "Telemetry"
|
||||
#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency")
|
||||
|
||||
Reference in New Issue
Block a user