Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit 3c72da7

Browse files
Xykonrobert-hh
andcommitted
Add support for EU433 region
Thanks to @robert-hh for the contribution via robert-hh@3b12fc5 Co-Authored-By: robert-hh <robert-hh@users.noreply.github.com>
1 parent 57b8aab commit 3c72da7

File tree

5 files changed

+125
-6
lines changed

5 files changed

+125
-6
lines changed

esp32/application.mk

+2-1
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ APP_LIB_LORA_SRC_C = $(addprefix lib/lora/,\
233233
mac/region/RegionEU868.c \
234234
mac/region/RegionUS915.c \
235235
mac/region/RegionCN470.c \
236+
mac/region/RegionEU433.c \
236237
mac/region/RegionIN865.c \
237238
system/delay.c \
238239
system/gpio.c \
@@ -375,7 +376,7 @@ APP_LDFLAGS += $(LDFLAGS) -T esp32_out.ld -T esp32.project.ld -T esp32.rom.ld -T
375376
# add the application specific CFLAGS
376377
CFLAGS += $(APP_INC) -DMICROPY_NLR_SETJMP=1 -DMBEDTLS_CONFIG_FILE='"mbedtls/esp_config.h"' -DHAVE_CONFIG_H -DESP_PLATFORM -DFFCONF_H=\"lib/oofatfs/ffconf.h\" -DWITH_POSIX
377378
CFLAGS_SIGFOX += $(APP_INC) -DMICROPY_NLR_SETJMP=1 -DMBEDTLS_CONFIG_FILE='"mbedtls/esp_config.h"' -DHAVE_CONFIG_H -DESP_PLATFORM
378-
CFLAGS += -DREGION_AS923 -DREGION_AU915 -DREGION_EU868 -DREGION_US915 -DREGION_CN470 -DREGION_IN865 -DBASE=0 -DPYBYTES=1
379+
CFLAGS += -DREGION_AS923 -DREGION_AU915 -DREGION_EU868 -DREGION_US915 -DREGION_CN470 -DREGION_EU433 -DREGION_IN865 -DBASE=0 -DPYBYTES=1
379380
# Specify if this is base or Pybytes Firmware
380381
ifeq ($(VARIANT),BASE)
381382
CFLAGS += -DVARIANT=0

esp32/mods/modlora.c

+26-4
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
#include "lora/mac/region/RegionEU868.h"
5454
#include "lora/mac/region/RegionCN470.h"
5555
#include "lora/mac/region/RegionIN865.h"
56+
#include "lora/mac/region/RegionEU433.h"
5657

5758
// openThread includes
5859
#ifdef LORA_OPENTHREAD_ENABLED
@@ -1361,12 +1362,17 @@ static void lora_validate_frequency (uint32_t frequency) {
13611362
goto freq_error;
13621363
}
13631364
break;
1364-
case LORAMAC_REGION_EU868:
1365+
case LORAMAC_REGION_EU433:
13651366
#if defined(LOPY4)
1366-
if (frequency < 410000000 || frequency > 870000000) {
1367+
if (frequency < 433000000 || frequency > 435000000) { // LoRa 433 - 434
1368+
goto freq_error;
1369+
}
13671370
#else
1368-
if (frequency < 863000000 || frequency > 870000000) {
1371+
goto freq_error;
13691372
#endif
1373+
break;
1374+
case LORAMAC_REGION_EU868:
1375+
if (frequency < 863000000 || frequency > 870000000) {
13701376
goto freq_error;
13711377
}
13721378
break;
@@ -1437,6 +1443,7 @@ static bool lora_validate_data_rate (uint32_t data_rate) {
14371443
case LORAMAC_REGION_AS923:
14381444
case LORAMAC_REGION_EU868:
14391445
case LORAMAC_REGION_AU915:
1446+
case LORAMAC_REGION_EU433:
14401447
case LORAMAC_REGION_CN470:
14411448
case LORAMAC_REGION_IN865:
14421449
if (data_rate > DR_6) {
@@ -1489,11 +1496,16 @@ static void lora_validate_device_class (DeviceClass_t device_class) {
14891496
static void lora_validate_region (LoRaMacRegion_t region) {
14901497
if (region != LORAMAC_REGION_AS923 && region != LORAMAC_REGION_AU915
14911498
&& region != LORAMAC_REGION_EU868 && region != LORAMAC_REGION_US915
1492-
&& region != LORAMAC_REGION_CN470 && region != LORAMAC_REGION_IN865) {
1499+
&& region != LORAMAC_REGION_IN865
1500+
#if defined(LOPY4)
1501+
&& region != LORAMAC_REGION_EU433 && region != LORAMAC_REGION_CN470
1502+
#endif
1503+
) {
14931504
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "invalid region %d", region));
14941505
}
14951506
}
14961507

1508+
14971509
static void lora_set_config (lora_cmd_data_t *cmd_data) {
14981510
lora_obj.stack_mode = cmd_data->info.init.stack_mode;
14991511
lora_obj.bandwidth = cmd_data->info.init.bandwidth;
@@ -1710,6 +1722,9 @@ static mp_obj_t lora_init_helper(lora_obj_t *self, const mp_arg_val_t *args) {
17101722
case LORAMAC_REGION_EU868:
17111723
cmd_data.info.init.frequency = 868000000;
17121724
break;
1725+
case LORAMAC_REGION_EU433:
1726+
cmd_data.info.init.frequency = 433175000;
1727+
break;
17131728
case LORAMAC_REGION_CN470:
17141729
cmd_data.info.init.frequency = 470000000;
17151730
case LORAMAC_REGION_IN865:
@@ -1735,6 +1750,9 @@ static mp_obj_t lora_init_helper(lora_obj_t *self, const mp_arg_val_t *args) {
17351750
case LORAMAC_REGION_EU868:
17361751
cmd_data.info.init.tx_power = 14;
17371752
break;
1753+
case LORAMAC_REGION_EU433:
1754+
cmd_data.info.init.tx_power = 12;
1755+
break;
17381756
default:
17391757
break;
17401758
}
@@ -1894,6 +1912,7 @@ STATIC mp_obj_t lora_join(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *
18941912
break;
18951913
case LORAMAC_REGION_CN470:
18961914
case LORAMAC_REGION_EU868:
1915+
case LORAMAC_REGION_EU433:
18971916
case LORAMAC_REGION_IN865:
18981917
dr = DR_5;
18991918
break;
@@ -1925,6 +1944,7 @@ STATIC mp_obj_t lora_join(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *
19251944
goto dr_error;
19261945
}
19271946
break;
1947+
case LORAMAC_REGION_EU433:
19281948
case LORAMAC_REGION_CN470:
19291949
case LORAMAC_REGION_EU868:
19301950
if (dr > DR_5) {
@@ -2506,6 +2526,7 @@ STATIC const mp_map_elem_t lora_locals_dict_table[] = {
25062526
{ MP_OBJ_NEW_QSTR(MP_QSTR_US915), MP_OBJ_NEW_SMALL_INT(LORAMAC_REGION_US915) },
25072527
{ MP_OBJ_NEW_QSTR(MP_QSTR_CN470), MP_OBJ_NEW_SMALL_INT(LORAMAC_REGION_CN470) },
25082528
{ MP_OBJ_NEW_QSTR(MP_QSTR_IN865), MP_OBJ_NEW_SMALL_INT(LORAMAC_REGION_IN865) },
2529+
{ MP_OBJ_NEW_QSTR(MP_QSTR_EU433), MP_OBJ_NEW_SMALL_INT(LORAMAC_REGION_EU433) },
25092530
};
25102531

25112532
STATIC MP_DEFINE_CONST_DICT(lora_locals_dict, lora_locals_dict_table);
@@ -2551,6 +2572,7 @@ static int lora_socket_socket (mod_network_socket_obj_t *s, int *_errno) {
25512572
switch (lora_obj.region) {
25522573
case LORAMAC_REGION_AS923:
25532574
case LORAMAC_REGION_EU868:
2575+
case LORAMAC_REGION_EU433:
25542576
case LORAMAC_REGION_CN470:
25552577
dr = DR_5;
25562578
break;

lib/lora/mac/region/Region.c

+6
Original file line numberDiff line numberDiff line change
@@ -286,8 +286,11 @@ Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jae
286286
#define EU433_NEXT_CHANNEL( ) else if(region == LORAMAC_REGION_EU433) { return RegionEU433NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); }
287287
#define EU433_CHANNEL_ADD( ) else if(region == LORAMAC_REGION_EU433) { return RegionEU433ChannelAdd( channelAdd ); }
288288
#define EU433_CHANNEL_REMOVE( ) else if(region == LORAMAC_REGION_EU433) { return RegionEU433ChannelsRemove( channelRemove ); }
289+
#define EU433_CHANNEL_MANUAL_ADD( ) EU433_CASE { return RegionEU433ChannelManualAdd( channelAdd ); }
290+
#define EU433_CHANNEL_MANUAL_REMOVE( ) EU433_CASE { return RegionEU433ChannelsRemove( channelRemove ); }
289291
#define EU433_SET_CONTINUOUS_WAVE( ) else if(region == LORAMAC_REGION_EU433) { RegionEU433SetContinuousWave( continuousWave );}
290292
#define EU433_APPLY_DR_OFFSET( ) else if(region == LORAMAC_REGION_EU433) { return RegionEU433ApplyDrOffset( downlinkDwellTime, dr, drOffset ); }
293+
#define EU433_FORCE_JOIN_DATARATE( ) EU433_CASE { return RegionEU433ForceJoinDataRate( joinDr, alternateDr ); }
291294
#else
292295
#define EU433_IS_ACTIVE( )
293296
#define EU433_GET_PHY_PARAM( )
@@ -310,8 +313,11 @@ Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jae
310313
#define EU433_NEXT_CHANNEL( )
311314
#define EU433_CHANNEL_ADD( )
312315
#define EU433_CHANNEL_REMOVE( )
316+
#define EU433_CHANNEL_MANUAL_ADD( )
317+
#define EU433_CHANNEL_MANUAL_REMOVE( )
313318
#define EU433_SET_CONTINUOUS_WAVE( )
314319
#define EU433_APPLY_DR_OFFSET( )
320+
#define EU433_FORCE_JOIN_DATARATE( )
315321
#endif
316322

317323
#ifdef REGION_EU868

lib/lora/mac/region/RegionEU433.c

+80-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jae
2323
#include <math.h>
2424

2525
#include "board.h"
26-
#include "LoRaMac.h"
26+
#include "lora/mac/LoRaMac.h"
2727
#include "esp_attr.h"
2828

2929
#include "utilities.h"
@@ -1007,6 +1007,76 @@ LoRaMacStatus_t RegionEU433ChannelAdd( ChannelAddParams_t* channelAdd )
10071007
return LORAMAC_STATUS_OK;
10081008
}
10091009

1010+
LoRaMacStatus_t RegionEU433ChannelManualAdd( ChannelAddParams_t* channelAdd )
1011+
{
1012+
uint8_t band = 0;
1013+
bool drInvalid = false;
1014+
bool freqInvalid = false;
1015+
uint8_t id = channelAdd->ChannelId;
1016+
1017+
if( id >= EU433_MAX_NB_CHANNELS )
1018+
{
1019+
return LORAMAC_STATUS_PARAMETER_INVALID;
1020+
}
1021+
1022+
// Validate the datarate range
1023+
if( RegionCommonValueInRange( channelAdd->NewChannel->DrRange.Fields.Min, EU433_TX_MIN_DATARATE, EU433_TX_MAX_DATARATE ) == false )
1024+
{
1025+
drInvalid = true;
1026+
}
1027+
if( RegionCommonValueInRange( channelAdd->NewChannel->DrRange.Fields.Max, EU433_TX_MIN_DATARATE, EU433_TX_MAX_DATARATE ) == false )
1028+
{
1029+
drInvalid = true;
1030+
}
1031+
if( channelAdd->NewChannel->DrRange.Fields.Min > channelAdd->NewChannel->DrRange.Fields.Max )
1032+
{
1033+
drInvalid = true;
1034+
}
1035+
1036+
// Default channels don't accept all values
1037+
if( id < EU433_NUMB_DEFAULT_CHANNELS )
1038+
{
1039+
// Validate the datarate range for min: must be DR_0
1040+
if( channelAdd->NewChannel->DrRange.Fields.Min > DR_0 )
1041+
{
1042+
drInvalid = true;
1043+
}
1044+
// Validate the datarate range for max: must be DR_5 <= Max <= TX_MAX_DATARATE
1045+
if( RegionCommonValueInRange( channelAdd->NewChannel->DrRange.Fields.Max, DR_5, EU433_TX_MAX_DATARATE ) == false )
1046+
{
1047+
drInvalid = true;
1048+
}
1049+
}
1050+
1051+
// Check frequency
1052+
if( freqInvalid == false )
1053+
{
1054+
if( VerifyTxFreq( channelAdd->NewChannel->Frequency ) == false )
1055+
{
1056+
freqInvalid = true;
1057+
}
1058+
}
1059+
1060+
// Check status
1061+
if( ( drInvalid == true ) && ( freqInvalid == true ) )
1062+
{
1063+
return LORAMAC_STATUS_FREQ_AND_DR_INVALID;
1064+
}
1065+
if( drInvalid == true )
1066+
{
1067+
return LORAMAC_STATUS_DATARATE_INVALID;
1068+
}
1069+
if( freqInvalid == true )
1070+
{
1071+
return LORAMAC_STATUS_FREQUENCY_INVALID;
1072+
}
1073+
1074+
memcpy( &(Channels[id]), channelAdd->NewChannel, sizeof( Channels[id] ) );
1075+
Channels[id].Band = band;
1076+
ChannelsMask[0] |= ( 1 << id );
1077+
return LORAMAC_STATUS_OK;
1078+
}
1079+
10101080
bool RegionEU433ChannelsRemove( ChannelRemoveParams_t* channelRemove )
10111081
{
10121082
uint8_t id = channelRemove->ChannelId;
@@ -1044,3 +1114,12 @@ uint8_t RegionEU433ApplyDrOffset( uint8_t downlinkDwellTime, int8_t dr, int8_t d
10441114
}
10451115
return datarate;
10461116
}
1117+
1118+
bool RegionEU433ForceJoinDataRate( int8_t joinDr, AlternateDrParams_t* alternateDr )
1119+
{
1120+
uint8_t DRToCounter[6] = { 48, 32, 24, 16, 8, 1 };
1121+
if (joinDr < sizeof(DRToCounter)) {
1122+
alternateDr->NbTrials = DRToCounter[joinDr];
1123+
}
1124+
return true;
1125+
}

lib/lora/mac/region/RegionEU433.h

+11
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,15 @@ LoRaMacStatus_t RegionEU433ChannelAdd( ChannelAddParams_t* channelAdd );
441441
*/
442442
bool RegionEU433ChannelsRemove( ChannelRemoveParams_t* channelRemove );
443443

444+
/*!
445+
* \brief Adds a channel manually.
446+
*
447+
* \param [IN] channelAdd Pointer to the function parameters.
448+
*
449+
* \retval Status of the operation.
450+
*/
451+
LoRaMacStatus_t RegionEU433ChannelManualAdd( ChannelAddParams_t* channelAdd );
452+
444453
/*!
445454
* \brief Sets the radio into continuous wave mode.
446455
*
@@ -461,6 +470,8 @@ void RegionEU433SetContinuousWave( ContinuousWaveParams_t* continuousWave );
461470
*/
462471
uint8_t RegionEU433ApplyDrOffset( uint8_t downlinkDwellTime, int8_t dr, int8_t drOffset );
463472

473+
bool RegionCN470ForceJoinDataRate( int8_t joinDr, AlternateDrParams_t *alternateDr );
474+
464475
/*! \} defgroup REGIONEU433 */
465476

466477
#endif // __REGION_EU433_H__

0 commit comments

Comments
 (0)