feat: Support for ext. Multiplex MLink JR type module (#3352)
* introducing external MLink module telemetry as module PPM subtype * implemented fix for sensor discovery display not showing all detected sensors (is in separate PR too) implemented PPM subtypes in Companion * add PPM subtype to model printer finalize subtypes for PPM in Companion * added logic to try to use HW UART with inverters turned off first (e.g. NV14), then, if not successfull use soft serial inverted (== uninverted data due to HW inverters on PCB) changed start bit detection IRQ priority from 5 to the previous 0 (also in separate PR) * extended telemetry timeout to 2s due to slow Mlink RSSI update rate * changed the "NOTLM" sub-type texts to: - "No Telem" for 128x64 (this is the max numbers of characters it can take) - "No Telemetry" everything else including Companion * Companion: - lower case 1st charachter on PpmSubTypeStrings to ppmSubTypeStrings - added telemetry hooks for ppmSubTypeStrings stringx * simplified serial port initialization for MLink telemetry * editorial change: corrected obsolete comment
This commit is contained in:
@@ -31,6 +31,7 @@ struct MLinkSensor
|
||||
};
|
||||
|
||||
const MLinkSensor mlinkSensors[] = {
|
||||
{MLINK_SPECIAL, STR_SENSOR_SPECIAL, UNIT_RAW, 0},
|
||||
{MLINK_RX_VOLTAGE, STR_SENSOR_BATT, UNIT_VOLTS, 1},
|
||||
{MLINK_VOLTAGE, STR_SENSOR_VFAS, UNIT_VOLTS, 1},
|
||||
{MLINK_CURRENT, STR_SENSOR_CURR, UNIT_AMPS, 1},
|
||||
@@ -44,6 +45,7 @@ const MLinkSensor mlinkSensors[] = {
|
||||
{MLINK_CAPACITY, STR_SENSOR_CAPACITY, UNIT_MAH, 0},
|
||||
{MLINK_FLOW, STR_SENSOR_FLOW, UNIT_MILLILITERS, 0},
|
||||
{MLINK_DISTANCE, STR_SENSOR_DIST, UNIT_KM, 1},
|
||||
{MLINK_GRATE, STR_SENSOR_ACC, UNIT_G, 1},
|
||||
{MLINK_LQI, STR_SENSOR_RSSI, UNIT_RAW, 0},
|
||||
{MLINK_LOSS, STR_SENSOR_LOSS, UNIT_RAW, 0},
|
||||
{MLINK_TX_RSSI, STR_SENSOR_TX_RSSI, UNIT_RAW, 0},
|
||||
@@ -59,13 +61,17 @@ const MLinkSensor * getMLinkSensor(uint16_t id)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void processMLinkPacket(const uint8_t * packet)
|
||||
void processMLinkPacket(const uint8_t * packet, bool multi)
|
||||
{
|
||||
const uint8_t * data = packet + 2;
|
||||
const uint8_t * data = packet; // pointer to setup for external module
|
||||
|
||||
// Multi telem
|
||||
setTelemetryValue(PROTOCOL_TELEMETRY_MLINK, MLINK_TX_RSSI, 0, 0, (packet[0] * 100) / 31, UNIT_RAW, 0);
|
||||
setTelemetryValue(PROTOCOL_TELEMETRY_MLINK, MLINK_TX_LQI, 0, 0, packet[1], UNIT_RAW, 0);
|
||||
if(multi) {
|
||||
// Multi telem
|
||||
setTelemetryValue(PROTOCOL_TELEMETRY_MLINK, MLINK_TX_RSSI, 0, 0, (packet[0] * 100) / 31, UNIT_RAW, 0);
|
||||
setTelemetryValue(PROTOCOL_TELEMETRY_MLINK, MLINK_TX_LQI, 0, 0, packet[1], UNIT_RAW, 0);
|
||||
|
||||
data = &packet[2]; // correct pointer to data for Multimodule
|
||||
}
|
||||
|
||||
// M-Link telem
|
||||
if (data[0] == 0x13) { // Telemetry type RX-9
|
||||
@@ -74,6 +80,9 @@ void processMLinkPacket(const uint8_t * packet)
|
||||
val = val >> 1; // remove alarm flag
|
||||
uint8_t adress = (data[i] & 0xF0) >> 4;
|
||||
switch (data[i] & 0x0F) {
|
||||
case MLINK_SVC:
|
||||
setTelemetryValue(PROTOCOL_TELEMETRY_MLINK, MLINK_SPECIAL, 0, 0, val & 0x007f, UNIT_RAW, 0);
|
||||
break;
|
||||
case MLINK_VOLTAGE:
|
||||
if ((data[i] & 0xF0) == 0x00){
|
||||
setTelemetryValue(PROTOCOL_TELEMETRY_MLINK, MLINK_RX_VOLTAGE, 0, adress, val, UNIT_VOLTS, 1);
|
||||
@@ -121,6 +130,9 @@ void processMLinkPacket(const uint8_t * packet)
|
||||
case MLINK_DISTANCE:
|
||||
setTelemetryValue(PROTOCOL_TELEMETRY_MLINK, MLINK_DISTANCE, 0, adress, val, UNIT_KM, 1);
|
||||
break;
|
||||
case MLINK_GRATE:
|
||||
setTelemetryValue(PROTOCOL_TELEMETRY_MLINK, MLINK_GRATE, 0, adress, val, UNIT_G, 1);
|
||||
break;
|
||||
case MLINK_LQI:
|
||||
uint8_t mlinkRssi = data[i + 1] >> 1;
|
||||
setTelemetryValue(PROTOCOL_TELEMETRY_MLINK, MLINK_LQI, 0, 0, mlinkRssi, UNIT_RAW, 0);
|
||||
@@ -137,7 +149,7 @@ void processMLinkPacket(const uint8_t * packet)
|
||||
setTelemetryValue(PROTOCOL_TELEMETRY_MLINK, MLINK_LQI, 0, 0, mlinkRssi, UNIT_RAW, 0);
|
||||
telemetryData.rssi.set(mlinkRssi);
|
||||
if (mlinkRssi > 0) {
|
||||
telemetryStreaming = TELEMETRY_TIMEOUT10ms;
|
||||
telemetryStreaming = 2*TELEMETRY_TIMEOUT10ms; // extended to 2s due to slow Mlink RSSI update rate
|
||||
}
|
||||
setTelemetryValue(PROTOCOL_TELEMETRY_MLINK, MLINK_LOSS, 0, 0, packet[7], UNIT_RAW, 0);
|
||||
}
|
||||
@@ -166,3 +178,61 @@ void mlinkSetDefault(int index, uint16_t id, uint8_t subId, uint8_t instance)
|
||||
|
||||
storageDirty(EE_MODEL);
|
||||
}
|
||||
|
||||
void processExternalMLinkSerialData(void* ctx, uint8_t data, uint8_t* buffer, uint8_t* len) {
|
||||
static bool destuff = false; // byte requires adjustment
|
||||
static bool started = false; // start of frame detected
|
||||
|
||||
if(!started) { // waiting for start byte
|
||||
if (data == MSB_STX) { // start byte detected
|
||||
destuff = false; // init
|
||||
*len = 0;
|
||||
started = true;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(data == MSB_STUFF_ESC) { // ignore stuffing byte
|
||||
destuff = true; // and treat next byte
|
||||
return;
|
||||
}
|
||||
|
||||
if(data != MSB_ETX) { // store any other byte than end byte
|
||||
if(*len >= MSB_EXT_MODULE_PACKET_LEN) { // sanity check: number of data bytes received
|
||||
started = false; // try again
|
||||
return;
|
||||
}
|
||||
|
||||
if(destuff) { // byte requires stuffing treatment
|
||||
destuff = false;
|
||||
data -= MSB_STUFF_OFFSET; // adjust byte
|
||||
}
|
||||
|
||||
buffer[(*len)++] = data; // collect data
|
||||
return;
|
||||
}
|
||||
|
||||
started = false; // end byte received, prepare for next frame, check buffer sanity
|
||||
|
||||
if(*len != MSB_EXT_MODULE_PACKET_LEN) { // sanity check: number of data bytes received
|
||||
return;
|
||||
}
|
||||
|
||||
if(buffer[6] != MSB_NORMAL && // sanity check: telemetry ok
|
||||
buffer[6] != MSB_NORMAL_FAST && // status must be normal mode with or without fast response
|
||||
buffer[6] != MSB_RANGE && // or range test mode with or without fast response
|
||||
buffer[6] != MSB_RANGE_FAST ) { // to have valid telemetry
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t sum = 1; // sanity check: checksum
|
||||
for (uint8_t i = 0; i < MSB_EXT_MODULE_PACKET_LEN; i++)
|
||||
sum += buffer[i]; // expect sum == 1+0xff = 0x00 for valid packet
|
||||
if (sum) { // fail packet if sum is not equal to 0x00
|
||||
return;
|
||||
}
|
||||
|
||||
// buffer is sane, build MPM like buffer and process it
|
||||
buffer[6] = MSB_VALID_TELEMETRY; // indicate valid telemetry, bytes 7-12 contain 2 Mlink parameters
|
||||
processMLinkPacket(&buffer[6], false); // process telemetry packet as if it came from MPM
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user