Skip to content

Commit 3b12fc5

Browse files
committed
eu433: Change firmware to support eu433
1 parent 94bb382 commit 3b12fc5

File tree

5 files changed

+131
-6
lines changed

5 files changed

+131
-6
lines changed

esp32/application.mk

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ APP_LIB_LORA_SRC_C = $(addprefix lib/lora/,\
222222
mac/region/RegionEU868.c \
223223
mac/region/RegionUS915.c \
224224
mac/region/RegionCN470.c \
225+
mac/region/RegionEU433.c \
225226
mac/region/RegionIN865.c \
226227
system/delay.c \
227228
system/gpio.c \
@@ -365,7 +366,7 @@ APP_LDFLAGS += $(LDFLAGS) -T esp32_out.ld -T esp32.common.ld -T esp32.rom.ld -T
365366
# add the application specific CFLAGS
366367
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
367368
CFLAGS_SIGFOX += $(APP_INC) -DMICROPY_NLR_SETJMP=1 -DMBEDTLS_CONFIG_FILE='"mbedtls/esp_config.h"' -DHAVE_CONFIG_H -DESP_PLATFORM
368-
CFLAGS += -DREGION_AS923 -DREGION_AU915 -DREGION_EU868 -DREGION_US915 -DREGION_CN470 -DREGION_IN865 -DBASE=0 -DPYBYTES=1
369+
CFLAGS += -DREGION_AS923 -DREGION_AU915 -DREGION_EU868 -DREGION_US915 -DREGION_CN470 -DREGION_EU433 -DREGION_IN865 -DBASE=0 -DPYBYTES=1
369370
# Specify if this is base or Pybytes Firmware
370371
ifeq ($(VARIANT),BASE)
371372
CFLAGS += -DVARIANT=0

esp32/mods/modlora.c

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
#include "lora/mac/region/RegionEU868.h"
5555
#include "lora/mac/region/RegionCN470.h"
5656
#include "lora/mac/region/RegionIN865.h"
57+
#include "lora/mac/region/RegionEU433.h"
5758

5859
// openThread includes
5960
#ifdef LORA_OPENTHREAD_ENABLED
@@ -1349,12 +1350,17 @@ static void lora_validate_frequency (uint32_t frequency) {
13491350
goto freq_error;
13501351
}
13511352
break;
1352-
case LORAMAC_REGION_EU868:
1353+
case LORAMAC_REGION_EU433:
13531354
#if defined(LOPY4)
1354-
if (frequency < 410000000 || frequency > 870000000) {
1355+
if (frequency < 433000000 || frequency > 435000000) { // LoRa 433 - 434
1356+
goto freq_error;
1357+
}
13551358
#else
1356-
if (frequency < 863000000 || frequency > 870000000) {
1359+
goto freq_error;
13571360
#endif
1361+
break;
1362+
case LORAMAC_REGION_EU868:
1363+
if (frequency < 863000000 || frequency > 870000000) {
13581364
goto freq_error;
13591365
}
13601366
break;
@@ -1399,6 +1405,11 @@ static void lora_validate_channel (uint32_t index) {
13991405
goto channel_error;
14001406
}
14011407
break;
1408+
case LORAMAC_REGION_EU433:
1409+
if (index >= EU433_MAX_NB_CHANNELS) {
1410+
goto channel_error;
1411+
}
1412+
break;
14021413
case LORAMAC_REGION_IN865:
14031414
if (index >= IN865_MAX_NB_CHANNELS) {
14041415
goto channel_error;
@@ -1425,6 +1436,7 @@ static bool lora_validate_data_rate (uint32_t data_rate) {
14251436
case LORAMAC_REGION_AS923:
14261437
case LORAMAC_REGION_EU868:
14271438
case LORAMAC_REGION_AU915:
1439+
case LORAMAC_REGION_EU433:
14281440
case LORAMAC_REGION_CN470:
14291441
case LORAMAC_REGION_IN865:
14301442
if (data_rate > DR_6) {
@@ -1477,7 +1489,11 @@ static void lora_validate_device_class (DeviceClass_t device_class) {
14771489
static void lora_validate_region (LoRaMacRegion_t region) {
14781490
if (region != LORAMAC_REGION_AS923 && region != LORAMAC_REGION_AU915
14791491
&& region != LORAMAC_REGION_EU868 && region != LORAMAC_REGION_US915
1480-
&& region != LORAMAC_REGION_CN470 && region != LORAMAC_REGION_IN865) {
1492+
&& region != LORAMAC_REGION_IN865
1493+
#if defined(LOPY4)
1494+
&& region != LORAMAC_REGION_EU433 && region != LORAMAC_REGION_CN470
1495+
#endif
1496+
) {
14811497
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "invalid region %d", region));
14821498
}
14831499
}
@@ -1698,6 +1714,9 @@ static mp_obj_t lora_init_helper(lora_obj_t *self, const mp_arg_val_t *args) {
16981714
case LORAMAC_REGION_EU868:
16991715
cmd_data.info.init.frequency = 868000000;
17001716
break;
1717+
case LORAMAC_REGION_EU433:
1718+
cmd_data.info.init.frequency = 433175000;
1719+
break;
17011720
case LORAMAC_REGION_CN470:
17021721
cmd_data.info.init.frequency = 470000000;
17031722
case LORAMAC_REGION_IN865:
@@ -1723,6 +1742,9 @@ static mp_obj_t lora_init_helper(lora_obj_t *self, const mp_arg_val_t *args) {
17231742
case LORAMAC_REGION_EU868:
17241743
cmd_data.info.init.tx_power = 14;
17251744
break;
1745+
case LORAMAC_REGION_EU433:
1746+
cmd_data.info.init.tx_power = 12;
1747+
break;
17261748
default:
17271749
break;
17281750
}
@@ -1881,6 +1903,7 @@ STATIC mp_obj_t lora_join(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *
18811903
dr = DR_4;
18821904
break;
18831905
case LORAMAC_REGION_CN470:
1906+
case LORAMAC_REGION_EU433:
18841907
case LORAMAC_REGION_EU868:
18851908
case LORAMAC_REGION_IN865:
18861909
dr = DR_5;
@@ -1913,6 +1936,7 @@ STATIC mp_obj_t lora_join(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *
19131936
goto dr_error;
19141937
}
19151938
break;
1939+
case LORAMAC_REGION_EU433:
19161940
case LORAMAC_REGION_CN470:
19171941
case LORAMAC_REGION_EU868:
19181942
if (dr > DR_5) {
@@ -2460,6 +2484,7 @@ STATIC const mp_map_elem_t lora_locals_dict_table[] = {
24602484
{ MP_OBJ_NEW_QSTR(MP_QSTR_AU915), MP_OBJ_NEW_SMALL_INT(LORAMAC_REGION_AU915) },
24612485
{ MP_OBJ_NEW_QSTR(MP_QSTR_EU868), MP_OBJ_NEW_SMALL_INT(LORAMAC_REGION_EU868) },
24622486
{ MP_OBJ_NEW_QSTR(MP_QSTR_US915), MP_OBJ_NEW_SMALL_INT(LORAMAC_REGION_US915) },
2487+
{ MP_OBJ_NEW_QSTR(MP_QSTR_EU433), MP_OBJ_NEW_SMALL_INT(LORAMAC_REGION_EU433) },
24632488
{ MP_OBJ_NEW_QSTR(MP_QSTR_CN470), MP_OBJ_NEW_SMALL_INT(LORAMAC_REGION_CN470) },
24642489
{ MP_OBJ_NEW_QSTR(MP_QSTR_IN865), MP_OBJ_NEW_SMALL_INT(LORAMAC_REGION_IN865) },
24652490
};
@@ -2507,6 +2532,7 @@ static int lora_socket_socket (mod_network_socket_obj_t *s, int *_errno) {
25072532
switch (lora_obj.region) {
25082533
case LORAMAC_REGION_AS923:
25092534
case LORAMAC_REGION_EU868:
2535+
case LORAMAC_REGION_EU433:
25102536
case LORAMAC_REGION_CN470:
25112537
dr = DR_5;
25122538
break;

lib/lora/mac/region/Region.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,11 @@ Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jae
291291
#define EU433_NEXT_CHANNEL( ) EU433_CASE { return RegionEU433NextChannel( nextChanParams, channel, time, aggregatedTimeOff ); }
292292
#define EU433_CHANNEL_ADD( ) EU433_CASE { return RegionEU433ChannelAdd( channelAdd ); }
293293
#define EU433_CHANNEL_REMOVE( ) EU433_CASE { return RegionEU433ChannelsRemove( channelRemove ); }
294+
#define EU433_CHANNEL_MANUAL_ADD( ) EU433_CASE { return RegionEU433ChannelManualAdd( channelAdd ); }
295+
#define EU433_CHANNEL_MANUAL_REMOVE( ) EU433_CASE { return RegionEU433ChannelsRemove( channelRemove ); }
294296
#define EU433_SET_CONTINUOUS_WAVE( ) EU433_CASE { RegionEU433SetContinuousWave( continuousWave ); break; }
295297
#define EU433_APPLY_DR_OFFSET( ) EU433_CASE { return RegionEU433ApplyDrOffset( downlinkDwellTime, dr, drOffset ); }
298+
#define EU433_FORCE_JOIN_DATARATE( ) EU433_CASE { return RegionEU433ForceJoinDataRate( joinDr, alternateDr ); }
296299
#else
297300
#define EU433_IS_ACTIVE( )
298301
#define EU433_GET_PHY_PARAM( )
@@ -315,8 +318,11 @@ Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jae
315318
#define EU433_NEXT_CHANNEL( )
316319
#define EU433_CHANNEL_ADD( )
317320
#define EU433_CHANNEL_REMOVE( )
321+
#define EU433_CHANNEL_MANUAL_ADD( )
322+
#define EU433_CHANNEL_MANUAL_REMOVE( )
318323
#define EU433_SET_CONTINUOUS_WAVE( )
319324
#define EU433_APPLY_DR_OFFSET( )
325+
#define EU433_FORCE_JOIN_DATARATE( )
320326
#endif
321327

322328
#ifdef REGION_EU868

lib/lora/mac/region/RegionEU433.c

Lines changed: 81 additions & 1 deletion
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,13 @@ uint8_t RegionEU433ApplyDrOffset( uint8_t downlinkDwellTime, int8_t dr, int8_t d
10441114
}
10451115
return datarate;
10461116
}
1117+
1118+
1119+
bool RegionEU433ForceJoinDataRate( int8_t joinDr, AlternateDrParams_t* alternateDr )
1120+
{
1121+
uint8_t DRToCounter[6] = { 48, 32, 24, 16, 8, 1 };
1122+
if (joinDr < sizeof(DRToCounter)) {
1123+
alternateDr->NbTrials = DRToCounter[joinDr];
1124+
}
1125+
return true;
1126+
}

lib/lora/mac/region/RegionEU433.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,16 @@ bool RegionEU433NextChannel( NextChanParams_t* nextChanParams, uint8_t* channel,
432432
*/
433433
LoRaMacStatus_t RegionEU433ChannelAdd( ChannelAddParams_t* channelAdd );
434434

435+
436+
/*!
437+
* \brief Adds a channel manually.
438+
*
439+
* \param [IN] channelAdd Pointer to the function parameters.
440+
*
441+
* \retval Status of the operation.
442+
*/
443+
LoRaMacStatus_t RegionEU433ChannelManualAdd( ChannelAddParams_t* channelAdd );
444+
435445
/*!
436446
* \brief Removes a channel.
437447
*
@@ -461,6 +471,8 @@ void RegionEU433SetContinuousWave( ContinuousWaveParams_t* continuousWave );
461471
*/
462472
uint8_t RegionEU433ApplyDrOffset( uint8_t downlinkDwellTime, int8_t dr, int8_t drOffset );
463473

474+
bool RegionCN470ForceJoinDataRate( int8_t joinDr, AlternateDrParams_t* alternateDr );
475+
464476
/*! \} defgroup REGIONEU433 */
465477

466478
#endif // __REGION_EU433_H__

0 commit comments

Comments
 (0)