summaryrefslogtreecommitdiff
path: root/recipes-connectivity/lora/lora-packet-forwarder/lora-packet-forwarder-dedup-rx.patch
blob: b80bb26f260c8077ab59829cc13559f07e6a4464 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
diff --git a/lora_pkt_fwd/src/lora_pkt_fwd.c b/lora_pkt_fwd/src/lora_pkt_fwd.c
index 801f28d..7c94308 100644
--- a/lora_pkt_fwd/src/lora_pkt_fwd.c
+++ b/lora_pkt_fwd/src/lora_pkt_fwd.c
@@ -1536,6 +1556,41 @@ void thread_up(void) {
         memcpy((void *)(buff_up + buff_index), (void *)"{\"rxpk\":[", 9);
         buff_index += 9;
 
+        if (nb_pkt > 1) {
+            uint32_t check_addr = 0;
+            uint16_t check_fcnt = 0;
+            float check_snr = -30.0;
+
+            for (i=0; i < nb_pkt; ++i) {
+                p = &rxpkt[i];
+                check_addr  = p->payload[1];
+               check_addr |= p->payload[2] << 8;
+               check_addr |= p->payload[3] << 16;
+               check_addr |= p->payload[4] << 24;
+
+                check_fcnt  = p->payload[6];
+                check_fcnt |= p->payload[7] << 8;
+                
+                check_snr = p->snr;
+
+                for (j=0; j < nb_pkt; ++j) {
+                    p = &rxpkt[j];
+                    mote_addr  = p->payload[1];
+                    mote_addr |= p->payload[2] << 8;
+                    mote_addr |= p->payload[3] << 16;
+                    mote_addr |= p->payload[4] << 24;
+
+                    mote_fcnt  = p->payload[6];
+                    mote_fcnt |= p->payload[7] << 8;
+
+                    if (check_addr == mote_addr && check_fcnt == mote_fcnt && p->snr < check_snr) {
+                        // set status of duplicate packets rx'd on wrong channel
+                        p->status = 1;
+                    }
+                }
+           }
+       }
+
         /* serialize Lora packets metadata and payload */
         pkt_in_dgram = 0;
         for (i=0; i < nb_pkt; ++i) {