1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

Merge pull request #14509 from jia200x/pr/lora_implicit_mode

sx127x: add support for implicit header mode
This commit is contained in:
Leandro Lanzieri 2020-07-29 12:52:00 +02:00 committed by GitHub
commit 224e2c977d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 79 additions and 0 deletions

View File

@ -455,6 +455,11 @@ static int _set(netdev_t *netdev, netopt_t opt, const void *val, size_t len)
sx127x_set_fixed_header_len_mode(dev, *((const netopt_enable_t*) val) ? true : false);
return sizeof(netopt_enable_t);
case NETOPT_PDU_SIZE:
assert(len <= sizeof(uint16_t));
sx127x_set_payload_length(dev, *((const uint16_t*) val));
return sizeof(uint16_t);
case NETOPT_PREAMBLE_LENGTH:
assert(len <= sizeof(uint16_t));
sx127x_set_preamble_length(dev, *((const uint16_t*) val));

View File

@ -186,6 +186,22 @@ typedef enum {
* @brief (uint16_t) maximum protocol data unit
*/
NETOPT_MAX_PDU_SIZE,
/**
* @brief (uint16_t) protocol data unit size
*
* When set, fixes the number of bytes to be received. This is required for
* MAC layers with implicit header mode (no packet length information in
* PDDU) and predictable packet length (e.g LoRaWAN beacons). The device
* driver implementation should attempt to read exactly the expected number
* of bytes (possibly filling it up with garbage data if the payload is
* smaller).
*
* When get, returns the number of expected bytes for the next reception.
*
* In some MAC layers it will only be effective if used in conjunction with
* @ref NETOPT_FIXED_HEADER
*/
NETOPT_PDU_SIZE,
/**
* @brief (@ref netopt_enable_t) frame preloading
*

View File

@ -41,6 +41,7 @@ static const char *_netopt_strmap[] = {
[NETOPT_IPV6_FORWARDING] = "NETOPT_IPV6_FORWARDING",
[NETOPT_IPV6_SND_RTR_ADV] = "NETOPT_IPV6_SND_RTR_ADV",
[NETOPT_TX_POWER] = "NETOPT_TX_POWER",
[NETOPT_PDU_SIZE] = "NETOPT_PDU_SIZE",
[NETOPT_MAX_PDU_SIZE] = "NETOPT_MAX_PDU_SIZE",
[NETOPT_PRELOADING] = "NETOPT_PRELOADING",
[NETOPT_PROMISCUOUSMODE] = "NETOPT_PROMISCUOUSMODE",

View File

@ -378,8 +378,65 @@ int reset_cmd(int argc, char **argv)
return 0;
}
static void _set_opt(netdev_t *netdev, netopt_t opt, bool val, char* str_help)
{
netopt_enable_t en = val ? NETOPT_ENABLE : NETOPT_DISABLE;
netdev->driver->set(netdev, opt, &en, sizeof(en));
printf("Successfully ");
if (val) {
printf("enabled ");
}
else {
printf("disabled ");
}
printf("%s\n", str_help);
}
int crc_cmd(int argc, char **argv)
{
netdev_t *netdev = (netdev_t *)&sx127x;
if (argc < 3 || strcmp(argv[1], "set") != 0) {
printf("usage: %s set <1|0>\n", argv[0]);
return 1;
}
int tmp = atoi(argv[2]);
_set_opt(netdev, NETOPT_INTEGRITY_CHECK, tmp, "CRC check");
return 0;
}
int implicit_cmd(int argc, char **argv)
{
netdev_t *netdev = (netdev_t *)&sx127x;
if (argc < 3 || strcmp(argv[1], "set") != 0) {
printf("usage: %s set <1|0>\n", argv[0]);
return 1;
}
int tmp = atoi(argv[2]);
_set_opt(netdev, NETOPT_FIXED_HEADER, tmp, "implicit header");
return 0;
}
int payload_cmd(int argc, char **argv)
{
netdev_t *netdev = (netdev_t *)&sx127x;
if (argc < 3 || strcmp(argv[1], "set") != 0) {
printf("usage: %s set <payload length>\n", argv[0]);
return 1;
}
uint16_t tmp = atoi(argv[2]);
netdev->driver->set(netdev, NETOPT_PDU_SIZE, &tmp, sizeof(tmp));
printf("Successfully set payload to %i\n", tmp);
return 0;
}
static const shell_command_t shell_commands[] = {
{ "setup", "Initialize LoRa modulation settings", lora_setup_cmd },
{ "implicit", "Enable implicit header", implicit_cmd },
{ "crc", "Enable CRC", crc_cmd },
{ "payload", "Set payload length (implicit header)", payload_cmd },
{ "random", "Get random number from sx127x", random_cmd },
{ "syncword", "Get/Set the syncword", syncword_cmd },
{ "rx_timeout", "Set the RX timeout", rx_timeout_cmd },