Skip to content

Commit 45c6d78

Browse files
committed
socket_zep: simulate RSSI
1 parent 460901a commit 45c6d78

1 file changed

Lines changed: 34 additions & 7 deletions

File tree

cpu/native/socket_zep/socket_zep.c

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
#include "net/ieee802154/radio.h"
3434
#include "socket_zep.h"
35+
#include "random.h"
3536

3637
#define ENABLE_DEBUG 0
3738
#include "debug.h"
@@ -47,6 +48,26 @@
4748
/* dummy packet to register with ZEP dispatcher */
4849
#define SOCKET_ZEP_V2_TYPE_HELLO (255)
4950

51+
/* simulate RSSI by calculating error function of LQI */
52+
static const uint8_t lqi_to_rssi[256] = {
53+
74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75,
54+
75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
55+
75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
56+
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78,
57+
78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80,
58+
80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 83,
59+
83, 83, 83, 83, 83, 84, 84, 84, 84, 85, 85, 85, 85, 85, 86, 86,
60+
86, 86, 87, 87, 87, 87, 88, 88, 88, 88, 89, 89, 89, 90, 90, 90,
61+
90, 91, 91, 91, 92, 92, 92, 93, 93, 93, 94, 94, 94, 95, 95, 95,
62+
96, 96, 96, 97, 97, 97, 98, 98, 98, 99, 99, 100, 100, 100, 101, 101,
63+
102, 102, 102, 103, 103, 104, 104, 104, 105, 105, 106, 106, 107, 107, 107, 108,
64+
108, 109, 109, 110, 110, 111, 111, 112, 112, 112, 113, 113, 114, 114, 115, 115,
65+
116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123,
66+
124, 124, 125, 125, 126, 126, 127, 127, 128, 128, 129, 129, 130, 130, 131, 131,
67+
132, 132, 133, 133, 134, 135, 135, 136, 136, 137, 137, 138, 138, 139, 139, 140,
68+
140, 141, 141, 142, 142, 143, 143, 144, 144, 145, 145, 146, 146, 147, 147, 148,
69+
};
70+
5071
static size_t _zep_hdr_fill_v2_data(socket_zep_t *dev, zep_v2_data_hdr_t *hdr,
5172
size_t payload_len)
5273
{
@@ -245,12 +266,14 @@ static void _send_ack(void *arg)
245266
uint8_t ack[3];
246267
zep_v2_data_hdr_t hdr;
247268

269+
/* sending ACK should only happen if we received a frame */
248270
assert(zepdev->state == ZEPDEV_STATE_RX_RECV);
271+
/* ACK request bit should be set if we get here */
249272
assert((rxbuf[0] & IEEE802154_FCF_ACK_REQ) != 0);
250273

251274
DEBUG("socket_zep::send_ack: seq_no: %u\n", rxbuf[2]);
252275

253-
_zep_hdr_fill(zepdev, &hdr.hdr, sizeof(ack) + 2);
276+
_zep_hdr_fill(zepdev, &hdr.hdr, sizeof(ack) + IEEE802154_FCF_LEN);
254277

255278
ack[0] = IEEE802154_FCF_TYPE_ACK; /* FCF */
256279
ack[1] = 0; /* FCF */
@@ -561,35 +584,39 @@ static int _read(ieee802154_dev_t *dev, void *buf, size_t max_size,
561584
ieee802154_rx_info_t *info)
562585
{
563586
socket_zep_t *zepdev = dev->priv;
564-
int res = 0;
587+
size_t res;
565588

566589
DEBUG("socket_zep::read: reading up to %zu bytes into %p\n", max_size, buf);
567590

568591
if (buf == NULL || zepdev->rcv_len == 0) {
569-
goto out;
592+
return 0;
570593
}
571594

572595
DEBUG("socket_zep::read: %zu/%zu bytes into %p\n",
573596
max_size, zepdev->rcv_len - sizeof(zep_v2_data_hdr_t) - IEEE802154_FCS_LEN, buf);
574597

575598
if (max_size != zepdev->rcv_len - sizeof(zep_v2_data_hdr_t) - IEEE802154_FCS_LEN) {
576599
DEBUG("socket_zep::read: size mismatch!\n");
577-
res = -EINVAL;
578-
goto out;
600+
return -EINVAL;
579601
}
580602

581603
zep_v2_data_hdr_t *zep = (zep_v2_data_hdr_t *)zepdev->rcv_buf;
582604

583605
if (info) {
584606
info->lqi = zep->lqi_val;
585-
info->rssi = -IEEE802154_RADIO_RSSI_OFFSET;
607+
info->rssi = lqi_to_rssi[zep->lqi_val]
608+
/* slightly randomize simulated RSSI */
609+
+ ((random_uint32() & 0x3) - 2);
586610
}
587611

588612
/* return payload size without frame checksum */
589613
res = zep->length - IEEE802154_FCS_LEN;
614+
if (res > max_size) {
615+
return -ENOBUFS;
616+
}
617+
590618
/* skip the ZEP header, just copy payload without FCS */
591619
memcpy(buf, zep + 1, res);
592-
out:
593620
return res;
594621
}
595622

0 commit comments

Comments
 (0)