retry attempt

This commit is contained in:
2018-04-09 08:35:24 +02:00
parent 99904eec7c
commit da7faf6957
5 changed files with 74 additions and 11 deletions
+34 -1
View File
@@ -71,6 +71,8 @@ void start_slave_cmd(uint8_t slave_addr, uint16_t frame_len, uint8_t cksum)
txmsg_cksum = cksum;
}
#define MAX_RETRY 20
void handle_txframe_chunk(const uint8_t *buffer, uint16_t size)
{
uint32_t wanted = MIN(txmsg_len - txmsg_collected, size);
@@ -98,11 +100,34 @@ void handle_txframe_chunk(const uint8_t *buffer, uint16_t size)
uint32_t remain = txmsg_len;
for (int i = 0; i <= txmsg_len/32; i++) {
uint8_t chunk = (uint8_t) MIN(remain, 32);
bool suc = NRF_SendPacket(pipe, &txmsg_payload[i*32], chunk);
bool suc = false;
uint16_t delay = 1;
// repeated tx attempts
for (int j = 0; j < MAX_RETRY; j++) {
suc = NRF_SendPacket(pipe, &txmsg_payload[i*32], chunk); // use the pipe to retrieve the address
if (!suc) {
dbg_nrf("Retry");
LL_mDelay(delay);
delay += 2; // longer delay next time
} else {
break;
}
} // TODO it sometimes gets through after a retry but the communication stalls??
if(delay != 1 && suc) {
dbg_nrf(" Succ after retry");
}
remain -= chunk;
if (!suc) {
dbg("Sending failed, discard rest");
NRF_PowerDown();
NRF_FlushRx();
NRF_FlushTx();
NRF_ModeRX();
break; // skip rest of the frame
}
}
@@ -179,7 +204,15 @@ void gw_handle_usb_out(uint8_t *buffer)
void handle_cmd_reset(void)
{
// mq_reset(&usb_inq);
// TODO this may be causing problems??
NRF_ResetPipes();
NRF_PowerDown();
NRF_FlushRx();
NRF_FlushTx();
NRF_ModeRX();
}
void handle_cmd_addnodes(PayloadParser *pp)
+8
View File
@@ -5,6 +5,7 @@
#include "main.h"
#include <stdbool.h>
#include <string.h>
#include <msg_queue.h>
#include "debug.h"
#include "msg_queue.h"
@@ -13,6 +14,7 @@ MQueue usb_inq;
void mq_init(MQueue *mq)
{
mq->nw = 0;
mq->lr = MQ_LEN-1;
}
@@ -21,6 +23,12 @@ bool mq_can_post(MQueue *mq)
return mq->nw != mq->lr;
}
void mq_reset(MQueue *mq)
{
mq_init(mq);
memset(mq->slots, 0, sizeof(mq->slots));
}
bool mq_post(MQueue *mq, const uint8_t *buffer, uint32_t len)
{
if (!mq_can_post(mq)) {
+20 -10
View File
@@ -387,9 +387,7 @@ uint8_t NRF_ReceivePacket(uint8_t *Packet, uint8_t *PipeNum)
}
if (pw > 32) {
CHIPSELECT {
spi(CMD_FLUSH_RX);
}
NRF_FlushRx();
pw = 0;
} else {
// Read the reception pipe number
@@ -430,9 +428,7 @@ bool NRF_SendPacket(uint8_t PipeNum, const uint8_t *Packet, uint8_t Length)
NRF_ModeTX(); // Make sure in TX mode
NRF_SetTxAddress(nrf_pipe_addr[PipeNum]); // this sets the Tx addr and also pipe 0 addr for ACK
CHIPSELECT {
spi(CMD_FLUSH_TX);
};
NRF_FlushTx();
CHIPSELECT {
spi(CMD_WR_TX_PLD);
@@ -468,7 +464,7 @@ bool NRF_SendPacket(uint8_t PipeNum, const uint8_t *Packet, uint8_t Length)
void NRF_ResetPipes(void)
{
NRF_WriteRegister(RG_EN_RXADDR, 0); // disable all pipes
NRF_WriteRegister(RG_EN_RXADDR, 1); // disable all pipes
for (int i = 0; i < 6; i++) {
nrf_pipe_addr[i] = 0;
@@ -476,6 +472,20 @@ void NRF_ResetPipes(void)
}
}
void NRF_FlushRx(void)
{
CHIPSELECT {
spi(CMD_FLUSH_RX);
}
}
void NRF_FlushTx(void)
{
CHIPSELECT {
spi(CMD_FLUSH_TX);
}
}
void NRF_Init(uint8_t pSpeed)
{
// Set the required output pins
@@ -491,14 +501,14 @@ void NRF_Init(uint8_t pSpeed)
// clear flags etc
NRF_PowerDown();
CHIPSELECT { spi(CMD_FLUSH_RX); }
CHIPSELECT { spi(CMD_FLUSH_TX); }
NRF_FlushRx();
NRF_FlushTx();
NRF_WriteRegister(RG_STATUS, 0x70);
NRF_WriteRegister(RG_CONFIG, ModeBits);
NRF_WriteRegister(RG_SETUP_AW, 0b11); // 5 byte addresses
NRF_WriteRegister(RG_EN_RXADDR, 0x00); // disable all
NRF_WriteRegister(RG_EN_RXADDR, 0x01); // disable all except 1 which we'll assign later
NRF_WriteRegister(RG_SETUP_RETR, 0x18); // 8 retries, 500 ms
NRF_WriteRegister(RG_RF_CH, 7); // channel 2 NO HIGHER THAN 83 in USA!