Skip to content

Commit 1d7c325

Browse files
committed
Merge branch 'task/user_reset' into 'master'
user_node_mapping: Better handling for user reset and mapping state See merge request app-frameworks/esp-rainmaker!291
2 parents b4641c8 + c1187fe commit 1d7c325

File tree

5 files changed

+51
-21
lines changed

5 files changed

+51
-21
lines changed

Diff for: components/esp_rainmaker/include/esp_rmaker_core.h

+2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ typedef enum {
4949
RMAKER_EVENT_USER_NODE_MAPPING_DONE,
5050
/** Local control started. Associated data is the NULL terminated Service Name */
5151
RMAKER_EVENT_LOCAL_CTRL_STARTED,
52+
/* User reset request successfully sent to ESP RainMaker Cloud */
53+
RMAKER_EVENT_USER_NODE_MAPPING_RESET,
5254
} esp_rmaker_event_t;
5355

5456
/** ESP RainMaker Node information */

Diff for: components/esp_rainmaker/include/esp_rmaker_user_mapping.h

+19
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,25 @@ extern "C"
1919
{
2020
#endif
2121

22+
/** User-Node Mapping states */
23+
typedef enum {
24+
/** Mapping does not exist or is not initialized */
25+
ESP_RMAKER_USER_MAPPING_RESET = 0,
26+
/** Mapping has started */
27+
ESP_RMAKER_USER_MAPPING_STARTED,
28+
/** Mapping is done */
29+
ESP_RMAKER_USER_MAPPING_DONE,
30+
} esp_rmaker_user_mapping_state_t;
31+
32+
/**
33+
* Get User-Node mapping state
34+
*
35+
* This returns the current user-node mapping state.
36+
*
37+
* @return user mapping state
38+
*/
39+
esp_rmaker_user_mapping_state_t esp_rmaker_user_node_mapping_get_state(void);
40+
2241
/**
2342
* Create User Mapping Endpoint
2443
*

Diff for: components/esp_rainmaker/src/core/esp_rmaker_core.c

+12-10
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,11 @@ static void esp_rmaker_event_handler(void* arg, esp_event_base_t event_base,
134134
/* Signal rmaker thread to continue execution */
135135
xEventGroupSetBits(wifi_event_group, WIFI_CONNECTED_EVENT);
136136
}
137-
} else if (event_base == RMAKER_EVENT && event_id == RMAKER_EVENT_USER_NODE_MAPPING_DONE) {
137+
} else if (event_base == RMAKER_EVENT &&
138+
(event_id == RMAKER_EVENT_USER_NODE_MAPPING_DONE ||
139+
event_id == RMAKER_EVENT_USER_NODE_MAPPING_RESET)) {
138140
esp_rmaker_params_mqtt_init();
139-
esp_event_handler_unregister(RMAKER_EVENT, RMAKER_EVENT_USER_NODE_MAPPING_DONE, &esp_rmaker_event_handler);
141+
esp_event_handler_unregister(RMAKER_EVENT, event_id, &esp_rmaker_event_handler);
140142
}
141143
}
142144

@@ -331,15 +333,15 @@ static void esp_rmaker_task(void *data)
331333
* status.
332334
*/
333335
if (esp_rmaker_user_node_mapping_get_state() != ESP_RMAKER_USER_MAPPING_STARTED) {
334-
esp_rmaker_start_user_node_mapping("esp-rmaker", "failed");
336+
esp_rmaker_reset_user_node_mapping();
337+
/* Wait for user reset to finish. */
338+
err = esp_event_handler_register(RMAKER_EVENT, RMAKER_EVENT_USER_NODE_MAPPING_RESET,
339+
&esp_rmaker_event_handler, NULL);
340+
} else {
341+
/* Wait for User Node mapping to finish. */
342+
err = esp_event_handler_register(RMAKER_EVENT, RMAKER_EVENT_USER_NODE_MAPPING_DONE,
343+
&esp_rmaker_event_handler, NULL);
335344
}
336-
/* Wait for User Node mapping to finish. This will also consider the above dummy user
337-
* node mapping request as a successful mapping, but that is still fine since the
338-
* cloud would have reset the mappings. This allows other alternative user node mappings
339-
* to be used after this point, which may be independent of provisioning.
340-
*/
341-
err = esp_event_handler_register(RMAKER_EVENT, RMAKER_EVENT_USER_NODE_MAPPING_DONE,
342-
&esp_rmaker_event_handler, NULL);
343345
if (err != ESP_OK) {
344346
ESP_LOGE(TAG, "Aborting!!!");
345347
goto rmaker_end;

Diff for: components/esp_rainmaker/src/core/esp_rmaker_internal.h

+1-7
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,6 @@ typedef enum {
3030
ESP_RMAKER_STATE_STOP_REQUESTED,
3131
} esp_rmaker_state_t;
3232

33-
typedef enum {
34-
ESP_RMAKER_USER_MAPPING_RESET = 0,
35-
ESP_RMAKER_USER_MAPPING_STARTED,
36-
ESP_RMAKER_USER_MAPPING_DONE,
37-
} esp_rmaker_user_mapping_state_t;
38-
3933
typedef struct {
4034
esp_rmaker_param_val_t min;
4135
esp_rmaker_param_val_t max;
@@ -111,8 +105,8 @@ char *esp_rmaker_get_node_params(void);
111105
esp_err_t esp_rmaker_handle_set_params(char *data, size_t data_len, esp_rmaker_req_src_t src);
112106
esp_err_t esp_rmaker_user_mapping_prov_init(void);
113107
esp_err_t esp_rmaker_user_mapping_prov_deinit(void);
114-
esp_rmaker_user_mapping_state_t esp_rmaker_user_node_mapping_get_state(void);
115108
esp_err_t esp_rmaker_user_node_mapping_init(void);
109+
esp_err_t esp_rmaker_reset_user_node_mapping(void);
116110
esp_err_t esp_rmaker_init_local_ctrl_service(void);
117111
esp_err_t esp_rmaker_start_local_ctrl_service(const char *serv_name);
118112
static inline esp_err_t esp_rmaker_post_event(esp_rmaker_event_t event_id, void* data, size_t data_size)

Diff for: components/esp_rainmaker/src/core/esp_rmaker_user_mapping.c

+17-4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ static const char *TAG = "esp_rmaker_user_mapping";
3232
#define USER_MAPPING_ENDPOINT "cloud_user_assoc"
3333
#define USER_MAPPING_NVS_NAMESPACE "user_mapping"
3434
#define USER_ID_NVS_NAME "user_id"
35+
#define USER_RESET_ID "esp-rmaker"
36+
#define USER_RESET_KEY "failed"
3537

3638
typedef struct {
3739
char *user_id;
@@ -82,7 +84,15 @@ static void esp_rmaker_user_mapping_event_handler(void* arg, esp_event_base_t ev
8284
int msg_id = *((int *)event_data);
8385
if (msg_id == rmaker_user_mapping_data->mqtt_msg_id) {
8486
ESP_LOGI(TAG, "User Node association message published successfully.");
85-
rmaker_user_mapping_state = ESP_RMAKER_USER_MAPPING_DONE;
87+
esp_rmaker_user_mapping_data_t *data = (esp_rmaker_user_mapping_data_t *)arg;
88+
if (data && (strcmp(data->user_id, USER_RESET_ID) == 0)) {
89+
rmaker_user_mapping_state = ESP_RMAKER_USER_MAPPING_RESET;
90+
esp_rmaker_post_event(RMAKER_EVENT_USER_NODE_MAPPING_RESET, NULL, 0);
91+
} else {
92+
rmaker_user_mapping_state = ESP_RMAKER_USER_MAPPING_DONE;
93+
esp_rmaker_post_event(RMAKER_EVENT_USER_NODE_MAPPING_DONE, rmaker_user_mapping_data->user_id,
94+
strlen(rmaker_user_mapping_data->user_id) + 1);
95+
}
8696
#ifdef CONFIG_ESP_RMAKER_USER_ID_CHECK
8797
/* Store User Id in NVS since acknowledgement of the user-node association message is received */
8898
nvs_handle handle;
@@ -92,8 +102,6 @@ static void esp_rmaker_user_mapping_event_handler(void* arg, esp_event_base_t ev
92102
nvs_close(handle);
93103
}
94104
#endif
95-
esp_rmaker_post_event(RMAKER_EVENT_USER_NODE_MAPPING_DONE, rmaker_user_mapping_data->user_id,
96-
strlen(rmaker_user_mapping_data->user_id) + 1);
97105
esp_rmaker_user_mapping_cleanup_data();
98106
esp_event_handler_unregister(RMAKER_COMMON_EVENT, RMAKER_MQTT_EVENT_PUBLISHED,
99107
&esp_rmaker_user_mapping_event_handler);
@@ -108,7 +116,7 @@ static void esp_rmaker_user_mapping_cb(void *priv_data)
108116
return;
109117
}
110118
esp_event_handler_register(RMAKER_COMMON_EVENT, RMAKER_MQTT_EVENT_PUBLISHED,
111-
&esp_rmaker_user_mapping_event_handler, NULL);
119+
&esp_rmaker_user_mapping_event_handler, data);
112120
char publish_payload[200];
113121
json_gen_str_t jstr;
114122
json_gen_str_start(&jstr, publish_payload, sizeof(publish_payload), NULL, NULL);
@@ -200,6 +208,11 @@ esp_err_t esp_rmaker_start_user_node_mapping(char *user_id, char *secret_key)
200208
return ESP_FAIL;
201209
}
202210

211+
esp_err_t esp_rmaker_reset_user_node_mapping(void)
212+
{
213+
return esp_rmaker_start_user_node_mapping(USER_RESET_ID, USER_RESET_KEY);
214+
}
215+
203216
int esp_rmaker_user_mapping_handler(uint32_t session_id, const uint8_t *inbuf, ssize_t inlen, uint8_t **outbuf, ssize_t *outlen, void *priv_data)
204217
{
205218
Rainmaker__RMakerConfigPayload *data;

0 commit comments

Comments
 (0)