Receiver RESET added

This commit is contained in:
Bertrand Songis
2019-04-15 18:08:11 +02:00
parent e7143c113d
commit d0c72be9e6
10 changed files with 92 additions and 26 deletions
+12
View File
@@ -246,11 +246,14 @@ enum MenuModelSetupItems {
#if defined(PXX2)
const char * STR_BIND = "Bind";
const char * STR_SHARE = "Share";
const char * STR_UNBIND = "Unbind";
const char * STR_ERASE = "Erase";
void removePXX2ReceiverIfEmpty(uint8_t moduleIdx, uint8_t receiverIdx)
{
if (is_memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME)) {
g_model.moduleData[moduleIdx].pxx2.receivers &= ~(1 << receiverIdx);
storageDirty(EE_MODEL);
}
}
@@ -296,6 +299,13 @@ void onPXX2ReceiverMenu(const char * result)
memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME);
storageDirty(EE_MODEL);
}
else if (result == STR_UNBIND || result == STR_ERASE) {
memclear(&reusableBuffer.moduleSetup.pxx2, sizeof(reusableBuffer.moduleSetup.pxx2));
reusableBuffer.moduleSetup.pxx2.resetReceiverIndex = receiverIdx;
reusableBuffer.moduleSetup.pxx2.resetReceiverFlags = (result == STR_ERASE ? 0xFF : 0x01);
moduleSettings[moduleIdx].mode = MODULE_MODE_RESET;
s_editMode = 1;
}
else {
removePXX2ReceiverIfEmpty(moduleIdx, receiverIdx);
}
@@ -1338,6 +1348,8 @@ void menuModelSetup(event_t event)
POPUP_MENU_ADD_ITEM(STR_OPTIONS);
POPUP_MENU_ADD_ITEM(STR_SHARE);
POPUP_MENU_ADD_ITEM(STR_DELETE);
POPUP_MENU_ADD_ITEM(STR_UNBIND);
POPUP_MENU_ADD_ITEM(STR_RESET);
POPUP_MENU_START(onPXX2ReceiverMenu);
}
}
+3
View File
@@ -1136,6 +1136,7 @@ union ReusableBuffer
union {
uint8_t registerStep;
uint8_t bindStep;
uint8_t resetStep;
};
uint32_t bindWaitTimeout;
uint8_t registerPopupVerticalPosition;
@@ -1149,7 +1150,9 @@ union ReusableBuffer
union {
uint8_t bindSelectedReceiverIndex;
uint8_t shareReceiverIndex;
uint8_t resetReceiverIndex;
};
uint8_t resetReceiverFlags;
} pxx2;
};
} moduleSetup;
+1
View File
@@ -76,6 +76,7 @@ enum ModuleSettingsMode
MODULE_MODE_BIND,
MODULE_MODE_SHARE,
MODULE_MODE_RANGECHECK,
MODULE_MODE_RESET
};
PACK(struct ModuleSettings {
+10 -1
View File
@@ -245,6 +245,13 @@ void Pxx2Pulses::setupBindFrame(uint8_t module)
}
}
void Pxx2Pulses::setupResetFrame(uint8_t module)
{
addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RESET);
Pxx2Transport::addByte(reusableBuffer.moduleSetup.pxx2.resetReceiverIndex);
Pxx2Transport::addByte(reusableBuffer.moduleSetup.pxx2.resetReceiverFlags);
}
void Pxx2Pulses::setupSpectrumAnalyser(uint8_t module)
{
if (moduleSettings[module].counter > 1000) {
@@ -261,7 +268,6 @@ void Pxx2Pulses::setupSpectrumAnalyser(uint8_t module)
Pxx2Transport::addWord(reusableBuffer.spectrumAnalyser.step);
}
void Pxx2Pulses::setupPowerMeter(uint8_t module)
{
if (moduleSettings[module].counter > 1000) {
@@ -303,6 +309,9 @@ void Pxx2Pulses::setupFrame(uint8_t module)
case MODULE_MODE_BIND:
setupBindFrame(module);
break;
case MODULE_MODE_RESET:
setupRegisterFrame(module);
break;
case MODULE_MODE_SPECTRUM_ANALYSER:
setupSpectrumAnalyser(module);
break;
+8
View File
@@ -33,6 +33,7 @@
#define PXX2_TYPE_ID_RX_SETTINGS 0x05
#define PXX2_TYPE_ID_HW_INFO 0x06
#define PXX2_TYPE_ID_SHARE 0x07
#define PXX2_TYPE_ID_RESET 0x08
#define PXX2_TYPE_ID_TELEMETRY 0xFE
#define PXX2_TYPE_C_POWER_METER 0x02
@@ -126,6 +127,11 @@ enum PXX2BindSteps {
BIND_OK
};
enum PXX2ResetSteps {
RESET_START,
RESET_OK
};
enum PXX2ReceiverStatus {
PXX2_HARDWARE_INFO,
PXX2_SETTINGS_READ,
@@ -184,6 +190,8 @@ class Pxx2Pulses: public PxxPulses<Pxx2Transport> {
void setupBindFrame(uint8_t module);
void setupResetFrame(uint8_t module);
void setupShareMode(uint8_t module);
void setupModuleSettingsFrame(uint8_t module);
+2 -2
View File
@@ -303,8 +303,8 @@ enum TelemetryProtocol
};
struct TelemetryData {
TelemetryValueWithMin swr; // TODO Min not needed
TelemetryValueWithMin rssi; // TODO Min not needed
TelemetryValue swr;
FilteredTelemetryValue rssi;
uint16_t xjtVersion;
bool varioHighPrecision;
};
+19 -1
View File
@@ -122,7 +122,8 @@ void processRegisterFrame(uint8_t module, uint8_t * frame)
reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_OK;
moduleSettings[module].mode = MODULE_MODE_NORMAL;
POPUP_INFORMATION(STR_REG_OK);
} else {
}
else {
TRACE("KO %s %s", &frame[4], reusableBuffer.moduleSetup.pxx2.registerRxName);
}
}
@@ -165,6 +166,19 @@ void processBindFrame(uint8_t module, uint8_t * frame)
}
}
void processResetFrame(uint8_t module, uint8_t * frame)
{
if (moduleSettings[module].mode != MODULE_MODE_RESET) {
return;
}
if (reusableBuffer.moduleSetup.pxx2.resetReceiverIndex == frame[3]) {
memclear(g_model.moduleData[module].pxx2.receiverName[reusableBuffer.moduleSetup.pxx2.resetReceiverIndex], PXX2_LEN_RX_NAME);
}
moduleSettings[module].mode = MODULE_MODE_NORMAL;
}
void processTelemetryFrame(uint8_t module, uint8_t * frame)
{
uint8_t origin = (module << 2) + (frame[3] & 0x03);
@@ -232,6 +246,10 @@ void processModuleFrame(uint8_t module, uint8_t *frame)
case PXX2_TYPE_ID_TELEMETRY:
processTelemetryFrame(module, frame);
break;
case PXX2_TYPE_ID_RESET:
processResetFrame(module, frame);
break;
}
}
+5 -3
View File
@@ -162,13 +162,15 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe
if (dataId == RSSI_ID) {
telemetryStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected
data = SPORT_DATA_U8(packet);
if(g_model.frsky.rssiSource) {
if (g_model.frsky.rssiSource) {
TelemetrySensor * sensor = & g_model.telemetrySensors[g_model.frsky.rssiSource];
if(sensor->instance == instance)
if (sensor->instance == instance) {
telemetryData.rssi.set(data);
}
}
else
else {
telemetryData.rssi.set(data);
}
}
else if (dataId == R9_PWR_ID) {
uint32_t r9pwr[] = {100, 200, 500, 1000};
+11 -13
View File
@@ -20,12 +20,12 @@
#include "opentx.h"
void TelemetryValueWithMin::reset()
void FilteredTelemetryValue::reset()
{
memclear(this, sizeof(*this));
}
void TelemetryValueWithMin::set(uint8_t value)
void FilteredTelemetryValue::set(uint8_t value)
{
if (this->value == 0) {
memset(values, value, TELEMETRY_AVERAGE_COUNT);
@@ -44,19 +44,17 @@ void TelemetryValueWithMin::set(uint8_t value)
sum += value;
this->value = sum/(TELEMETRY_AVERAGE_COUNT+1);
}
}
void TelemetryValueWithMin::reset()
{
memclear(this, sizeof(*this));
}
void TelemetryValueWithMin::set(uint8_t value)
{
FilteredTelemetryValue::set(value);
if (!min || value < min) {
min = value;
}
}
void TelemetryValueWithMinMax::set(uint8_t value, uint8_t unit)
{
TelemetryValueWithMin::set(value);
if (unit != UNIT_VOLTS) {
this->value = value;
}
if (!max || value > max) {
max = value;
}
}
+21 -6
View File
@@ -25,19 +25,34 @@
#define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading!
#define RAW_FRSKY_MINMAX(v) v.values[TELEMETRY_AVERAGE_COUNT-1]
class TelemetryValueWithMin {
class TelemetryValue {
public:
uint8_t value; // fitered value (average of last TELEMETRY_AVERAGE_COUNT+1 values)
uint8_t min;
uint8_t value;
void set(uint8_t value)
{
this->value = value;
}
void reset()
{
this->value = 0;
};
};
class FilteredTelemetryValue: public TelemetryValue {
public:
uint8_t value; // filtered value (average of last TELEMETRY_AVERAGE_COUNT+1 values)
uint8_t values[TELEMETRY_AVERAGE_COUNT];
void set(uint8_t value);
void reset();
};
class TelemetryValueWithMinMax: public TelemetryValueWithMin {
class TelemetryValueWithMin: public FilteredTelemetryValue {
public:
uint8_t max;
void set(uint8_t value, uint8_t unit);
uint8_t min;
void set(uint8_t value);
void reset();
};
#endif // _TELEMETRY_HOLDERS_H_