diff --git a/lib/include/mqtt_outbox.h b/lib/include/mqtt_outbox.h index 8d5f342..21b1436 100644 --- a/lib/include/mqtt_outbox.h +++ b/lib/include/mqtt_outbox.h @@ -16,6 +16,7 @@ struct outbox_item; typedef struct outbox_list_t *outbox_handle_t; typedef struct outbox_item *outbox_item_handle_t; typedef struct outbox_message *outbox_message_handle_t; +typedef long long outbox_tick_t; typedef struct outbox_message { uint8_t *data; @@ -35,17 +36,17 @@ typedef enum pending_state { } pending_state_t; outbox_handle_t outbox_init(void); -outbox_item_handle_t outbox_enqueue(outbox_handle_t outbox, outbox_message_handle_t message, int tick); -outbox_item_handle_t outbox_dequeue(outbox_handle_t outbox, pending_state_t pending, int *tick); +outbox_item_handle_t outbox_enqueue(outbox_handle_t outbox, outbox_message_handle_t message, outbox_tick_t tick); +outbox_item_handle_t outbox_dequeue(outbox_handle_t outbox, pending_state_t pending, outbox_tick_t *tick); outbox_item_handle_t outbox_get(outbox_handle_t outbox, int msg_id); uint8_t *outbox_item_get_data(outbox_item_handle_t item, size_t *len, uint16_t *msg_id, int *msg_type, int *qos); esp_err_t outbox_delete(outbox_handle_t outbox, int msg_id, int msg_type); esp_err_t outbox_delete_msgid(outbox_handle_t outbox, int msg_id); esp_err_t outbox_delete_msgtype(outbox_handle_t outbox, int msg_type); -int outbox_delete_expired(outbox_handle_t outbox, int current_tick, int timeout); +int outbox_delete_expired(outbox_handle_t outbox, outbox_tick_t current_tick, outbox_tick_t timeout); esp_err_t outbox_set_pending(outbox_handle_t outbox, int msg_id, pending_state_t pending); -esp_err_t outbox_set_tick(outbox_handle_t outbox, int msg_id, int tick); +esp_err_t outbox_set_tick(outbox_handle_t outbox, int msg_id, outbox_tick_t tick); int outbox_get_size(outbox_handle_t outbox); esp_err_t outbox_cleanup(outbox_handle_t outbox, int max_size); void outbox_destroy(outbox_handle_t outbox); diff --git a/lib/mqtt_outbox.c b/lib/mqtt_outbox.c index 5db1224..1723fb9 100644 --- a/lib/mqtt_outbox.c +++ b/lib/mqtt_outbox.c @@ -15,7 +15,7 @@ typedef struct outbox_item { int msg_id; int msg_type; int msg_qos; - int tick; + outbox_tick_t tick; int retry_count; pending_state_t pending; STAILQ_ENTRY(outbox_item) next; @@ -32,7 +32,7 @@ outbox_handle_t outbox_init(void) return outbox; } -outbox_item_handle_t outbox_enqueue(outbox_handle_t outbox, outbox_message_handle_t message, int tick) +outbox_item_handle_t outbox_enqueue(outbox_handle_t outbox, outbox_message_handle_t message, outbox_tick_t tick) { outbox_item_handle_t item = calloc(1, sizeof(outbox_item_t)); ESP_MEM_CHECK(TAG, item, return NULL); @@ -67,7 +67,7 @@ outbox_item_handle_t outbox_get(outbox_handle_t outbox, int msg_id) return NULL; } -outbox_item_handle_t outbox_dequeue(outbox_handle_t outbox, pending_state_t pending, int *tick) +outbox_item_handle_t outbox_dequeue(outbox_handle_t outbox, pending_state_t pending, outbox_tick_t *tick) { outbox_item_handle_t item; STAILQ_FOREACH(item, outbox, next) { @@ -131,7 +131,7 @@ esp_err_t outbox_set_pending(outbox_handle_t outbox, int msg_id, pending_state_t return ESP_FAIL; } -esp_err_t outbox_set_tick(outbox_handle_t outbox, int msg_id, int tick) +esp_err_t outbox_set_tick(outbox_handle_t outbox, int msg_id, outbox_tick_t tick) { outbox_item_handle_t item = outbox_get(outbox, msg_id); if (item) { @@ -155,7 +155,7 @@ esp_err_t outbox_delete_msgtype(outbox_handle_t outbox, int msg_type) return ESP_OK; } -int outbox_delete_expired(outbox_handle_t outbox, int current_tick, int timeout) +int outbox_delete_expired(outbox_handle_t outbox, outbox_tick_t current_tick, outbox_tick_t timeout) { int deleted_items = 0; outbox_item_handle_t item, tmp; diff --git a/mqtt_client.c b/mqtt_client.c index d5ab1c3..c16a41a 100644 --- a/mqtt_client.c +++ b/mqtt_client.c @@ -34,6 +34,8 @@ { if (key) { setfn(ssl, key, strlen(key)); } } #endif +_Static_assert(sizeof(uint64_t) == sizeof(outbox_tick_t), "mqtt-client tick type size different from outbox tick type"); + static const char *TAG = "MQTT_CLIENT"; #ifdef MQTT_SUPPORTED_FEATURE_EVENT_LOOP @@ -1100,8 +1102,8 @@ static esp_err_t mqtt_resend_queued(esp_mqtt_client_handle_t client, outbox_item static void esp_mqtt_task(void *pv) { esp_mqtt_client_handle_t client = (esp_mqtt_client_handle_t) pv; - uint32_t last_retransmit = 0; - int32_t msg_tick = 0; + uint64_t last_retransmit = 0; + outbox_tick_t msg_tick = 0; client->run = true; //get transport by scheme