Model Setup refactoring

This commit is contained in:
Bertrand Songis
2019-04-03 11:27:43 +02:00
parent 46dc85aa7e
commit 1d5b780c2f
12 changed files with 134 additions and 271 deletions
+4 -32
View File
@@ -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) {
+108 -181
View File
@@ -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;
}
}
}
+1 -22
View File
@@ -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
View File
@@ -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;
};
+4 -4
View File
@@ -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
View File
@@ -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]) {
+3 -5
View File
@@ -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)
+2 -3
View File
@@ -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);
+4 -12
View File
@@ -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;
+1 -1
View File
@@ -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")