Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
c48ddb1
1st
olliw42 May 24, 2024
d07e8e3
2nd, seems ok
olliw42 May 24, 2024
062b73a
nfc
olliw42 May 24, 2024
f43d224
change to ack with last received seq no
olliw42 May 27, 2024
67e45e5
ups
olliw42 May 27, 2024
19c5402
rx, previous frame handling corrected
olliw42 May 28, 2024
6d1ee37
Merge branch 'main' into dev-arq
olliw42 May 28, 2024
325d3c8
Merge branch 'main' into dev-arq
olliw42 May 28, 2024
197c44d
tx, correct mavlink parser reset
olliw42 May 28, 2024
4ea70dd
some streamlining, preperation
olliw42 May 29, 2024
d83bb71
more
olliw42 May 29, 2024
5e0f0c7
separate out error simulator
olliw42 May 30, 2024
fecd1d5
attempt at retry cnt
olliw42 May 30, 2024
19d4fe7
comment, nfc
olliw42 May 30, 2024
432324a
Merge branch 'main' into dev-arq
olliw42 May 31, 2024
f0204e1
that's strange, memset seems to fail if not unit8/char
olliw42 May 31, 2024
dab1168
rx, slight rearrangment, tidies
olliw42 May 31, 2024
3a00326
Merge branch 'main' into dev-arq
olliw42 Jun 1, 2024
b03ec59
Merge branch 'main' into dev-arq
olliw42 Jun 2, 2024
2a42d4d
rx, let flow control respect frame transmission rate, rx, adjust arq …
olliw42 Jun 3, 2024
f8636d1
tx, mavlink, add seq-based LQ metric
olliw42 Jun 5, 2024
5890cf0
Merge branch 'main' into dev-arq
olliw42 Jun 5, 2024
0f0754f
Merge branch 'main' into dev-arq
olliw42 Jun 6, 2024
75f4d30
Merge branch 'main' into dev-arq
olliw42 Jun 6, 2024
3f6b82b
Merge branch 'main' into dev-arq
olliw42 Jun 6, 2024
6e24f98
Merge branch 'main' into dev-arq
olliw42 Jun 7, 2024
2988cf5
rx, arq, more retries for 111Hz mode
olliw42 Jun 7, 2024
e2e0d7f
add compiled binaries
olliw42 Jun 7, 2024
1accf76
tx, arq, some (incomplete) improvements on frame lost
olliw42 Jun 8, 2024
25a423a
arq, framelost via limited seq_no attempt
olliw42 Jun 10, 2024
b0a7d7d
Merge branch 'main' into dev-arq
olliw42 Jun 11, 2024
3384f4a
remove sender side restriction to seq_no advancement. Add/keep simple…
olliw42 Jun 11, 2024
609eb22
update precompiled binaries
olliw42 Jun 12, 2024
bcd6c90
test, scan payload for marker
olliw42 Jun 12, 2024
5f43fc8
Merge branch 'main' into dev-arq
olliw42 Jun 20, 2024
30fce69
sync
olliw42 Jun 21, 2024
9d17218
new pre compiled
olliw42 Jun 21, 2024
b39c98b
Merge branch 'main' into dev-arq
olliw42 Jun 22, 2024
aa4c41f
precompiled
olliw42 Jun 22, 2024
37a4ab8
Merge branch 'main' into dev-arq
olliw42 Jun 25, 2024
3106187
cc
olliw42 Jun 28, 2024
517e8d9
Merge branch 'main' into dev-arq
olliw42 Jun 28, 2024
4b5971e
cc
olliw42 Jun 28, 2024
6df029a
Merge branch 'main' into dev-arq
olliw42 Jul 16, 2024
286d991
Merge branch 'main' into dev-arq
olliw42 Jul 19, 2024
ed4f274
formatting
olliw42 Jul 19, 2024
15fd452
Merge branch 'main' into dev-arq
olliw42 Jul 20, 2024
b20b9a5
Merge branch 'main' into dev-arq
olliw42 Jul 21, 2024
d69c5b4
some doc
olliw42 Jul 21, 2024
e74735a
tidy, nfc
olliw42 Jul 21, 2024
40a8cbc
try to do only rx->tx, doesn't fully work
olliw42 Jul 21, 2024
8199f4d
Merge branch 'dev-arq' into merge-main
olliw42 Jul 26, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3,246 changes: 3,246 additions & 0 deletions firmware/rx-E77-MBLKit-wle5cc-400-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

3,245 changes: 3,245 additions & 0 deletions firmware/rx-E77-MBLKit-wle5cc-400-xtal-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

3,259 changes: 3,259 additions & 0 deletions firmware/rx-E77-MBLKit-wle5cc-900-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

3,258 changes: 3,258 additions & 0 deletions firmware/rx-E77-MBLKit-wle5cc-900-xtal-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

2,677 changes: 2,677 additions & 0 deletions firmware/rx-FRM303-f072cb-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

Binary file not shown.
3,094 changes: 3,094 additions & 0 deletions firmware/rx-R9M-f103c8-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

2,963 changes: 2,963 additions & 0 deletions firmware/rx-R9MLitePro-v15-f303cc-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

Binary file not shown.
2,966 changes: 2,966 additions & 0 deletions firmware/rx-R9MM-f103rb-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

Binary file not shown.
3,017 changes: 3,017 additions & 0 deletions firmware/rx-R9MX-l433cb-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

3,136 changes: 3,136 additions & 0 deletions firmware/rx-Wio-E5-Grove-wle5jc-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

3,285 changes: 3,285 additions & 0 deletions firmware/rx-Wio-E5-Mini-wle5jc-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

3,253 changes: 3,253 additions & 0 deletions firmware/rx-easysolder-E77-E22-dual-wle5cc-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

3,252 changes: 3,252 additions & 0 deletions firmware/rx-easysolder-E77-E22-dual-wle5cc-xtal-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

3,554 changes: 3,554 additions & 0 deletions firmware/rx-easysolder-E77-E28-dualband-wle5cc-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
4,923 changes: 4,923 additions & 0 deletions firmware/tx-E77-MBLKit-wle5cc-400-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

4,922 changes: 4,922 additions & 0 deletions firmware/tx-E77-MBLKit-wle5cc-400-xtal-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

4,935 changes: 4,935 additions & 0 deletions firmware/tx-E77-MBLKit-wle5cc-900-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

4,934 changes: 4,934 additions & 0 deletions firmware/tx-E77-MBLKit-wle5cc-900-xtal-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

6,027 changes: 6,027 additions & 0 deletions firmware/tx-FRM303-f072cb-oled-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

5,127 changes: 5,127 additions & 0 deletions firmware/tx-FRM303-f072cb-usb-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

Binary file not shown.
4,798 changes: 4,798 additions & 0 deletions firmware/tx-R9M-f103c8-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

Binary file not shown.
3,388 changes: 3,388 additions & 0 deletions firmware/tx-R9MX-l433cb-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

4,921 changes: 4,921 additions & 0 deletions firmware/tx-Wio-E5-Mini-wle5jc-sdiode-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

4,993 changes: 4,993 additions & 0 deletions firmware/tx-Wio-E5-Mini-wle5jc-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

4,932 changes: 4,932 additions & 0 deletions firmware/tx-easysolder-E77-E22-dual-wle5cc-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

4,931 changes: 4,931 additions & 0 deletions firmware/tx-easysolder-E77-E22-dual-wle5cc-xtal-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

5,218 changes: 5,218 additions & 0 deletions firmware/tx-easysolder-E77-E28-dualband-wle5cc-v1.2.05-dev-arq-@b39c98bc.hex

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Binary file not shown.
28 changes: 27 additions & 1 deletion mLRS/Common/arq.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#pragma once

#define USE_ARQ // just for the moment, eventually should go
//#define USE_ARQ_DBG
#define USE_ARQ_DBG
#define USE_ARQ_RETRY_CNT -1 // -1: set by SetRetryCnt(), 0 = off, 255 = infinite,
#define USE_ARQ_TX_SIM_MISS 4 //9 // 0 = off
#define USE_ARQ_RX_SIM_MISS 3 //5 //5 // 0 = off
Expand Down Expand Up @@ -177,6 +177,9 @@ uint8_t tTransmitArq::SeqNo(void)

void tTransmitArq::SetRetryCnt(uint8_t retry_cnt)
{
//payload_retry_cnt = 0; return;
payload_retry_cnt = UINT8_MAX; return;

#ifndef USE_ARQ_DBG
payload_retry_cnt = retry_cnt;
#else
Expand Down Expand Up @@ -416,3 +419,26 @@ class tReceiveArq
#endif

#endif // ARQ_H

/* some sort of documentation
for the Rx -> Tx transmission direction:

Tx Rx
rarq tarq

prepare_transmit_frame() prepare_transmit_frame()
ack = AckSeqNo() get_fresh_payload = GetFreshPayload()
seq_no = SeqNo()
SetRetryCntAuto()
process_received_frame()
accept_payload = AcceptPayload()

handle_receive() handle_receive()
Received() AckReceived()
or FrameMissed() or FrameMissed()
FrameLost() -> reset parsers

handle_receive_none() handle_receive_none()
FrameMissed() FrameMissed()

*/
42 changes: 42 additions & 0 deletions mLRS/Common/frames.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,48 @@ typedef enum {
} CHECK_ENUM;


// update header info and rcdata with new data, keep payload
void update_txframe_stats_and_rcdata(tTxFrame* frame, tFrameStats* frame_stats, tRcData* rc)
{
uint16_t crc;

frame->sync_word = Config.FrameSyncWord;
// keep !! frame->status.seq_no = frame_stats->seq_no;
frame->status.ack = frame_stats->ack;
// keep !! frame->status.frame_type = type; // FRAME_TYPE_TX, FRAME_TYPE_TX_RX_CMD
frame->status.antenna = frame_stats->antenna;
frame->status.transmit_antenna = frame_stats->transmit_antenna;
frame->status.rssi_u7 = rssi_u7_from_i8(frame_stats->rssi);
frame->status.LQ_rc = frame_stats->LQ_rc;
frame->status.LQ_serial = frame_stats->LQ_serial;
// keep !! frame->status.payload_len = payload_len;

frame->rc1.ch0 = rc->ch[0]; // 0 .. 1024 .. 2047, 11 bits
frame->rc1.ch1 = rc->ch[1];
frame->rc1.ch2 = rc->ch[2];
frame->rc1.ch3 = rc->ch[3];
frame->rc2.ch4 = rc->ch[4]; // 0 .. 1024 .. 2047, 11 bits
frame->rc2.ch5 = rc->ch[5];
frame->rc2.ch6 = rc->ch[6];
frame->rc2.ch7 = rc->ch[7];
frame->rc2.ch8 = rc->ch[8] / 8; // 0 .. 128 .. 255, 8 bits
frame->rc2.ch9 = rc->ch[9] / 8;
frame->rc2.ch10 = rc->ch[10] / 8;
frame->rc2.ch11 = rc->ch[11] / 8;
frame->rc1.ch12 = (rc->ch[12] >= 1536) ? 2 : ((rc->ch[12] <= 512) ? 0 : 1); // 0 .. 1 .. 2, bits, 3-way
frame->rc1.ch13 = (rc->ch[13] >= 1536) ? 2 : ((rc->ch[13] <= 512) ? 0 : 1);
frame->rc2.ch14 = (rc->ch[14] >= 1536) ? 2 : ((rc->ch[14] <= 512) ? 0 : 1);
frame->rc2.ch15 = (rc->ch[15] >= 1536) ? 2 : ((rc->ch[15] <= 512) ? 0 : 1);

fmav_crc_init(&crc);
fmav_crc_accumulate_buf(&crc, (uint8_t*)frame, FRAME_TX_RX_HEADER_LEN + FRAME_TX_RCDATA1_LEN);
frame->crc1 = crc;

fmav_crc_accumulate_buf(&crc, (uint8_t*)frame + FRAME_TX_RX_HEADER_LEN + FRAME_TX_RCDATA1_LEN, FRAME_TX_RX_LEN - FRAME_TX_RX_HEADER_LEN - FRAME_TX_RCDATA1_LEN - 2);
frame->crc = crc;
}


void _pack_txframe_w_type(tTxFrame* frame, uint8_t type, tFrameStats* frame_stats, tRcData* rc, uint8_t* payload, uint8_t payload_len)
{
uint16_t crc;
Expand Down
56 changes: 27 additions & 29 deletions mLRS/CommonRx/mlrs-rx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ tRxClock rxclock;
tPowerupCounter powerup;
tRDiversity rdiversity;
tTDiversity tdiversity;
tTransmitArq tarq;
tReceiveArq rarq;


// is required in bind.h
Expand Down Expand Up @@ -288,9 +288,7 @@ void prepare_transmit_frame(uint8_t antenna)
uint8_t payload[FRAME_RX_PAYLOAD_LEN];
uint8_t payload_len = 0;

bool get_fresh_payload = tarq.GetFreshPayload();

if (get_fresh_payload) {
if (transmit_frame_type == TRANSMIT_FRAME_TYPE_NORMAL) {
// read data from serial
if (connected()) {
Expand All @@ -306,41 +304,24 @@ uint8_t payload_len = 0;
sx_serial.flush();
}
}
}

stats.last_transmit_antenna = antenna;

tFrameStats frame_stats;
frame_stats.seq_no = tarq.SeqNo();
frame_stats.ack = 1; // TODO
frame_stats.seq_no = stats.transmit_seq_no; // tarq.SeqNo();
frame_stats.ack = rarq.AckSeqNo();
frame_stats.antenna = stats.last_antenna;
frame_stats.transmit_antenna = antenna;
frame_stats.rssi = stats.GetLastRssi();
frame_stats.LQ_rc = stats.GetLQ_rc();
frame_stats.LQ_serial = stats.GetLQ_serial();

static bool rxFrame_valid = false; // just for now
if (get_fresh_payload) {
if (transmit_frame_type == TRANSMIT_FRAME_TYPE_NORMAL) {
pack_rxframe(&rxFrame, &frame_stats, payload, payload_len);
} else {
pack_rxcmdframe(&rxFrame, &frame_stats);
}
rxFrame_valid = true;

stats.cntFrameTransmitted();
tarq.SetRetryCntAuto(stats.GetFrameCnt(), Config.Mode);

} else {
// rxFrame should still hold the previous data
if (!rxFrame_valid) while(1){} // should not happen

update_rxframe_stats(&rxFrame, &frame_stats);
rxFrame_valid = true;

stats.cntFrameSkipped();
tarq.SetRetryCntAuto(stats.GetFrameCnt(), Config.Mode);
}
}


Expand All @@ -361,6 +342,9 @@ void process_received_frame(bool do_payload, tTxFrame* frame)

rcdata_from_txframe(&rcData, frame);

bool accept_payload = rarq.AcceptPayload();
if (!accept_payload) return; // frame has no fresh payload

// handle cmd frame
if (frame->status.frame_type == FRAME_TYPE_TX_RX_CMD) {
process_received_txcmdframe(frame);
Expand Down Expand Up @@ -405,11 +389,15 @@ tTxFrame* frame;
FAIL_WSTATE(BLINK_4, "rx_status failure", 0,0, link_rx1_status, link_rx2_status);
}

// handle transmit ARQ
if (rx_status > RX_STATUS_INVALID) { // RX_STATUS_CRC1_VALID, RX_STATUS_VALID: we have valid information on ack
tarq.AckReceived(frame->status.ack);
// handle receive ARQ, must come before process_received_frame()
if (rx_status == RX_STATUS_VALID) {
rarq.Received(frame->status.seq_no);
} else {
tarq.FrameMissed();
rarq.FrameMissed();
}
// check this before received data may be passed to parsers
if (rarq.FrameLost()) {
mavlink.FrameLost();
}

if (rx_status > RX_STATUS_INVALID) { // RX_STATUS_CRC1_VALID, RX_STATUS_VALID
Expand All @@ -434,7 +422,11 @@ tTxFrame* frame;

void handle_receive_none(void) // RX_STATUS_NONE
{
tarq.FrameMissed();
rarq.FrameMissed();

#ifdef USE_ARQ_DBG
dbg.puts("\nrec FMISSED");
#endif
}


Expand All @@ -445,6 +437,8 @@ void do_transmit(uint8_t antenna) // we send a frame to transmitter
return;
}

stats.transmit_seq_no++;

prepare_transmit_frame(antenna);

// to test asymmetric connection, fake rxFrame, to no send doesn't work as it blocks the sx
Expand Down Expand Up @@ -559,7 +553,7 @@ RESTARTCONTROLLER
stats.Init(Config.LQAveragingPeriod, Config.frame_rate_hz, Config.frame_rate_ms);
rdiversity.Init();
tdiversity.Init(Config.frame_rate_ms);
tarq.Init();
rarq.Init();

out.Configure(Setup.Rx.OutMode);
mavlink.Init();
Expand Down Expand Up @@ -710,6 +704,10 @@ IF_SX2(
if (doPostReceive) {
doPostReceive = false;

#ifdef USE_ARQ
if (rarq.SimulateMiss()) { link_rx1_status = link_rx2_status = RX_STATUS_NONE; }
#endif

bool frame_received, valid_frame_received, invalid_frame_received;
if (USE_ANTENNA1 && USE_ANTENNA2) {
frame_received = (link_rx1_status > RX_STATUS_NONE) || (link_rx2_status > RX_STATUS_NONE);
Expand Down Expand Up @@ -818,7 +816,7 @@ dbg.puts(s8toBCD_s(stats.last_rssi2));*/
sx2.SetToIdle();
}

if (!connected()) tarq.Disconnected();
if (!connected()) rarq.Disconnected();

DECc(tick_1hz_commensurate, Config.frame_rate_hz);
if (!tick_1hz_commensurate) {
Expand Down
Loading