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

Commit

Permalink
Merge pull request #515 from pycom/release_v1.20.2.r4_again
Browse files Browse the repository at this point in the history
Release v1.20.2.r4 again
  • Loading branch information
Xykon authored Jan 12, 2021
2 parents 044dfea + bee94a2 commit ffb0e1c
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 43 deletions.
22 changes: 8 additions & 14 deletions esp32/mods/machrtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ typedef struct _mach_rtc_obj_t {
bool synced;
} mach_rtc_obj_t;

static RTC_DATA_ATTR uint64_t delta_from_epoch_til_boot;
static RTC_DATA_ATTR uint32_t rtc_user_mem_len;
static RTC_DATA_ATTR uint8_t rtc_user_mem_data[MEM_USER_MAXLEN];

Expand All @@ -61,10 +60,10 @@ void rtc_init0(void) {

void mach_rtc_set_us_since_epoch(uint64_t nowus) {
struct timeval tv;

// store the packet timestamp
gettimeofday(&tv, NULL);
delta_from_epoch_til_boot = nowus - (uint64_t)((tv.tv_sec * 1000000ull) + tv.tv_usec);
tv.tv_usec = nowus % 1000000ull;
tv.tv_sec = nowus / 1000000ull;
settimeofday(&tv, NULL);
}

void mach_rtc_synced (void) {
Expand All @@ -78,8 +77,9 @@ bool mach_is_rtc_synced (void) {
uint64_t mach_rtc_get_us_since_epoch(void) {
struct timeval tv;
gettimeofday(&tv, NULL);
return (uint64_t)((tv.tv_sec * 1000000ull) + tv.tv_usec) + delta_from_epoch_til_boot;
};
return (uint64_t)(tv.tv_sec * 1000000ull ) + (tv.tv_usec);

}

STATIC uint64_t mach_rtc_datetime_us(const mp_obj_t datetime) {
timeutils_struct_time_t tm;
Expand Down Expand Up @@ -132,8 +132,6 @@ STATIC void mach_rtc_datetime(const mp_obj_t datetime) {
if (datetime != mp_const_none) {
useconds = mach_rtc_datetime_us(datetime);
mach_rtc_set_us_since_epoch(useconds);
} else {
mach_rtc_set_us_since_epoch(0);
}
}

Expand Down Expand Up @@ -197,14 +195,10 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(mach_rtc_init_obj, 1, mach_rtc_init);
STATIC mp_obj_t mach_rtc_now (mp_obj_t self_in) {
timeutils_struct_time_t tm;
uint64_t useconds;

useconds = mach_rtc_get_us_since_epoch();

struct timeval now;
gettimeofday(&now, NULL);

// get the time from the RTC
useconds = (now.tv_sec * 1000000ull ) + (now.tv_usec);
timeutils_seconds_since_epoch_to_struct_time((useconds) / 1000000ull, &tm);

mp_obj_t tuple[8] = {
mp_obj_new_int(tm.tm_year),
mp_obj_new_int(tm.tm_mon),
Expand Down
7 changes: 2 additions & 5 deletions esp32/mods/modbt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1062,12 +1062,9 @@ static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_
/// \class Bluetooth
static mp_obj_t bt_init_helper(bt_obj_t *self, const mp_arg_val_t *args) {
if (!self->init) {
if (!self->controller_active) {
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
esp_bt_controller_init(&bt_cfg);
self->controller_active = true;
}

esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
esp_bt_controller_init(&bt_cfg);
esp_bt_controller_enable(ESP_BT_MODE_BLE);

if (ESP_OK != esp_bluedroid_init()) {
Expand Down
43 changes: 20 additions & 23 deletions esp32/mods/modcoap.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ typedef struct mod_coap_resource_obj_s {
coap_resource_t* coap_resource;
struct mod_coap_resource_obj_s* next;
uint8_t* value;
unsigned char* uri;
uint32_t max_age;
uint16_t etag_value;
uint16_t value_len;
Expand Down Expand Up @@ -208,9 +207,10 @@ STATIC mod_coap_resource_obj_t* add_resource(const char* uri, uint8_t mediatype,
resource->next = NULL;

// uri parameter pointer will be destroyed, pass a pointer to a permanent location
resource->uri = m_malloc(strlen(uri));
memcpy(resource->uri, uri, strlen(uri));
resource->coap_resource = coap_resource_init((const unsigned char* )resource->uri, strlen(uri), 0);
unsigned char* uri_ptr = (unsigned char*)malloc(strlen(uri));
memcpy(uri_ptr, uri, strlen(uri));
// Pass COAP_RESOURCE_FLAGS_RELEASE_URI so Coap Library will free up the memory allocated to store the URI when the Resource is deleted
resource->coap_resource = coap_resource_init(uri_ptr, strlen(uri), COAP_RESOURCE_FLAGS_RELEASE_URI);
if(resource->coap_resource != NULL) {
// Add the resource to the Coap context
coap_add_resource(context->context, resource->coap_resource);
Expand Down Expand Up @@ -238,7 +238,7 @@ STATIC mod_coap_resource_obj_t* add_resource(const char* uri, uint8_t mediatype,
return resource;
}
else {
m_free(resource->uri);
free(uri_ptr);
m_del_obj(mod_coap_resource_obj_t, resource);
// Resource cannot be created
return NULL;
Expand Down Expand Up @@ -278,14 +278,12 @@ STATIC void remove_resource_by_key(coap_key_t key) {
previous->next = current->next;
}

// Free the URI
m_free(current->uri);
// Free the resource in coap's scope
coap_delete_resource(context->context, key);
// Free the element in MP scope
m_free(current->value);
free(current->value);
// Free the resource itself
m_free(current);
m_del_obj(mod_coap_resource_obj_t, current);

return;
}
Expand Down Expand Up @@ -320,7 +318,7 @@ STATIC void resource_update_value(mod_coap_resource_obj_t* resource, mp_obj_t ne

// Invalidate current data first
resource->value_len = 0;
m_free(resource->value);
free(resource->value);

if (mp_obj_is_integer(new_value)) {

Expand All @@ -334,7 +332,7 @@ STATIC void resource_update_value(mod_coap_resource_obj_t* resource, mp_obj_t ne
}

// Allocate memory for the new data
resource->value = m_malloc(resource->value_len);
resource->value = malloc(resource->value_len);
memcpy(resource->value, &value, sizeof(value));

} else {
Expand All @@ -344,7 +342,7 @@ STATIC void resource_update_value(mod_coap_resource_obj_t* resource, mp_obj_t ne
resource->value_len = value_bufinfo.len;

// Allocate memory for the new data
resource->value = m_malloc(resource->value_len);
resource->value = malloc(resource->value_len);
memcpy(resource->value, value_bufinfo.buf, resource->value_len);
}
}
Expand Down Expand Up @@ -748,16 +746,13 @@ STATIC coap_pdu_t * modcoap_new_request
// Helper function to create a new option for a request message
STATIC coap_list_t * modcoap_new_option_node(unsigned short key, unsigned int length, unsigned char *data) {

coap_list_t *node = m_malloc(sizeof(coap_list_t) + sizeof(coap_option) + length);
coap_list_t *node = malloc(sizeof(coap_list_t) + sizeof(coap_option) + length);
if (node) {
coap_option *option;
option = (coap_option *)(node->data);
COAP_OPTION_KEY(*option) = key;
COAP_OPTION_LENGTH(*option) = length;
memcpy(COAP_OPTION_DATA(*option), data, length);
} else {
m_free(node);
node = NULL;
}

return node;
Expand Down Expand Up @@ -937,7 +932,7 @@ STATIC mp_obj_t mod_coap_init(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map
// Only 1 context is supported currently
if(initialized == false) {

MP_STATE_PORT(coap_ptr) = m_malloc(sizeof(mod_coap_obj_t));
MP_STATE_PORT(coap_ptr) = m_new_obj(mod_coap_obj_t);
coap_obj_ptr = MP_STATE_PORT(coap_ptr);
coap_obj_ptr->context = NULL;
coap_obj_ptr->resources = NULL;
Expand Down Expand Up @@ -1235,19 +1230,21 @@ STATIC mp_obj_t mod_coap_send_request(mp_uint_t n_args, const mp_obj_t *pos_args
//TODO: allocate the proper length
size_t length = 300;
unsigned char* path = malloc(length);
int segments = coap_split_path(coap_uri.path.s, coap_uri.path.length, path, &length);
// Need to use a different pointer because when the segments are composed the pointer itself is moved
unsigned char* path_segment = path;
int segments = coap_split_path(coap_uri.path.s, coap_uri.path.length, path_segment, &length);

// Insert the segments as separate URI-Path options
while (segments--) {
node = modcoap_new_option_node(COAP_OPTION_URI_PATH, COAP_OPT_LENGTH(path), COAP_OPT_VALUE(path));
node = modcoap_new_option_node(COAP_OPTION_URI_PATH, COAP_OPT_LENGTH(path_segment), COAP_OPT_VALUE(path_segment));
if(node != NULL) {
LL_APPEND(coap_obj_ptr->optlist, node);
}

path += COAP_OPT_SIZE(path);
// Move the path_segment pointer to the next segment
path_segment += COAP_OPT_SIZE(path_segment);
}


// Free up the memory using the pointer pointing to the beginning of the memory area
free(path);

// Put Content Format option if given
Expand All @@ -1271,7 +1268,7 @@ STATIC mp_obj_t mod_coap_send_request(mp_uint_t n_args, const mp_obj_t *pos_args
while(coap_obj_ptr->optlist != NULL) {
next = coap_obj_ptr->optlist->next;
coap_obj_ptr->optlist->next = NULL;
m_free(coap_obj_ptr->optlist);
free(coap_obj_ptr->optlist);
coap_obj_ptr->optlist = next;
}

Expand Down
49 changes: 49 additions & 0 deletions esp32/mods/modpycom.c
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,53 @@ STATIC mp_obj_t mod_pycom_sigfox_info (size_t n_args, const mp_obj_t *pos_args,
}
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(mod_pycom_sigfox_info_obj, 0, mod_pycom_sigfox_info);

// This function creates a 128 bit long UUID stored in a byte array in Little Endian order from an input String
STATIC mp_obj_t create_128bit_le_uuid_from_string(mp_obj_t uuid_in) {

size_t length;
uint8_t new_uuid[16];
uint8_t i, j;

const char* uuid_char_in = mp_obj_str_get_data(uuid_in, &length);
// 1 character is stored on 1 byte because we received a String
// For 128 bit UUID maximum 32 characters long String can be accepted
if (length > 32) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Input string must not be longer than 32 characters!"));
}

// Pre-fill the whole array with 0 because the remaining/not given digits will be 0
char uuid_char[32] = {0};
memcpy(uuid_char, uuid_char_in, length);

for(i = 0, j = 0; i < 32; i = i+2) {

uint8_t lower_nibble = 0;
uint8_t upper_nibble = 0;

if(uuid_char[i] > 0) {
upper_nibble = hex_from_char(uuid_char[i]);
}

if(uuid_char[i+1] > 0) {
lower_nibble = hex_from_char(uuid_char[i+1]);
}

if(lower_nibble == 16 || upper_nibble == 16) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "UUID must only contain hexadecimal digits!"));
}

// Pack together the 4 bits digits into 1 byte
// Convert to Little Endian order because we expect that the digits of the input String follows the Natural Byte (Big Endian) order
new_uuid[15-j] = lower_nibble | (upper_nibble << 4);
j++;
}

mp_obj_t new_uuid_mp = mp_obj_new_bytearray(16, new_uuid);
return new_uuid_mp;

}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(create_128bit_le_uuid_from_string_obj, create_128bit_le_uuid_from_string);

STATIC const mp_map_elem_t pycom_module_globals_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_pycom) },
{ MP_OBJ_NEW_QSTR(MP_QSTR_heartbeat), (mp_obj_t)&mod_pycom_heartbeat_obj },
Expand All @@ -1039,6 +1086,8 @@ STATIC const mp_map_elem_t pycom_module_globals_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_wifi_pwd_sta), (mp_obj_t)&mod_pycom_wifi_pwd_sta_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_wifi_pwd_ap), (mp_obj_t)&mod_pycom_wifi_pwd_ap_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_wifi_mode_on_boot), (mp_obj_t)&mod_pycom_wifi_mode_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_create_128bit_le_uuid_from_string), (mp_obj_t)&create_128bit_le_uuid_from_string_obj },


#if defined(FIPY) || defined(LOPY4) || defined(SIPY)
{ MP_OBJ_NEW_QSTR(MP_QSTR_sigfox_info), (mp_obj_t)&mod_pycom_sigfox_info_obj },
Expand Down
2 changes: 1 addition & 1 deletion esp32/pycom_version.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#ifndef VERSION_H_
#define VERSION_H_

#define SW_VERSION_NUMBER "1.20.2.r3"
#define SW_VERSION_NUMBER "1.20.2.r4"

#define LORAWAN_VERSION_NUMBER "1.0.2"

Expand Down

0 comments on commit ffb0e1c

Please sign in to comment.