diff --git a/ADIS_ESP32_Eclipse/.project b/ADIS_ESP32_Eclipse/.project index 38c557d..b84ad82 100644 --- a/ADIS_ESP32_Eclipse/.project +++ b/ADIS_ESP32_Eclipse/.project @@ -5,6 +5,11 @@ + + org.eclipse.xtext.ui.shared.xtextBuilder + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder clean,full,incremental, @@ -23,6 +28,7 @@ org.eclipse.cdt.core.ccnature org.eclipse.cdt.managedbuilder.core.managedBuildNature org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.eclipse.xtext.ui.shared.xtextNature diff --git a/ADIS_ESP32_Eclipse/main/CMakeLists.txt b/ADIS_ESP32_Eclipse/main/CMakeLists.txt index b4fcedb..8696903 100644 --- a/ADIS_ESP32_Eclipse/main/CMakeLists.txt +++ b/ADIS_ESP32_Eclipse/main/CMakeLists.txt @@ -16,6 +16,8 @@ idf_component_register( "timer.c" "sntp_time.c" "robot.c" + "myMqtt.c" + "application.c" INCLUDE_DIRS "." diff --git a/ADIS_ESP32_Eclipse/main/application.c b/ADIS_ESP32_Eclipse/main/application.c new file mode 100644 index 0000000..1a1c4cc --- /dev/null +++ b/ADIS_ESP32_Eclipse/main/application.c @@ -0,0 +1,59 @@ +/* + * application.s + * + * Created on: 25.11.2022 + * Author: jonas + */ + +#include "application.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "myMqtt.h" +#include "wifi.h" + +static TaskHandle_t appTaskHandle; + +static void appTask(void *pv){ + if(pv != NULL){ + printf("task argument: %s\n", (char*)pv); + } + + printf("Application was started"); + fflush(stdout); + + while(WiFi_isConnected() == false){ + vTaskDelay(pdMS_TO_TICKS(1000)); + } + + // wifi now connected + printf("Application task detected that WiFi is connected\n"); + if(MyMqtt_Init()){ + vTaskDelay(pdMS_TO_TICKS(1000)); + printf("5s done\n"); + + MyMqtt_Subscribe("scada/status"); + + printf("Application endless task was started\n"); + fflush(stdout); + + // endless loop + for(;;){ + MyMqtt_Publish("scada/status", "Testmessage from ESP"); + + vTaskDelay(pdMS_TO_TICKS(10000)); + } + } else { + printf("Init of MyMqtt failed! Quitting application task.\n"); + } + +} + +BaseType_t res; + +void Application_Start(void){ + res = xTaskCreate(appTask, "task1", 4096/sizeof(StackType_t), (void*)"ARG_0", tskIDLE_PRIORITY, &appTaskHandle); + if(res != pdPASS){ + printf("creating myTask failed!\r\n"); + } +} + diff --git a/ADIS_ESP32_Eclipse/main/application.h b/ADIS_ESP32_Eclipse/main/application.h new file mode 100644 index 0000000..6d0383b --- /dev/null +++ b/ADIS_ESP32_Eclipse/main/application.h @@ -0,0 +1,13 @@ +/* + * application.h + * + * Created on: 25.11.2022 + * Author: jonas + */ + +#ifndef MAIN_APPLICATION_H_ +#define MAIN_APPLICATION_H_ + +void Application_Start(void); + +#endif /* MAIN_APPLICATION_H_ */ diff --git a/ADIS_ESP32_Eclipse/main/myMqtt.c b/ADIS_ESP32_Eclipse/main/myMqtt.c new file mode 100644 index 0000000..984245f --- /dev/null +++ b/ADIS_ESP32_Eclipse/main/myMqtt.c @@ -0,0 +1,121 @@ +/* + * myMqtt.c + * + * Created on: 25.11.2022 + * Author: jonas + */ + +#include "myMqtt.h" +#include +#include +#include +#include "esp_log.h" +#include "mqtt_client.h" + +// Settings +#define CONFIG_BROKER_URL "mqtt://10.180.254.80" + +// tag for logging with ESP_LOG +static const char *TAG = "MY_MQTT"; + +// declarations +static void log_error_if_nonzero(const char *message, int error_code); +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data); + +// variables +esp_mqtt_client_handle_t client; + +bool MyMqtt_Init(void){ + esp_mqtt_client_config_t mqtt_cfg = { + .uri = CONFIG_BROKER_URL, + }; + client = esp_mqtt_client_init(&mqtt_cfg); + /* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */ + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + esp_err_t mqtt_error = esp_mqtt_client_start(client); + + return mqtt_error == ESP_OK; +} + +void MyMqtt_Deinit(void){ + client = NULL; +} + +void MyMqtt_Publish(const char *topic, const char *data){ + int msg_id = esp_mqtt_client_publish(client, topic, data, 0, 1, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); +} + +void MyMqtt_Subscribe(const char *topic){ + int msg_id = esp_mqtt_client_subscribe(client, topic, 0); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d, success=%s", msg_id, msg_id==-1 ? "false" : "true"); +} + +/***********/ +/* HELPERS */ +/***********/ + +static void log_error_if_nonzero(const char *message, int error_code) +{ + if (error_code != 0) { + ESP_LOGE(TAG, "Last error %s: 0x%x", message, error_code); + } +} + +/* + * @brief Event handler registered to receive MQTT events + * + * This function is called by the MQTT client event loop. + * + * @param handler_args user data registered to the event. + * @param base Event base for the handler(always MQTT Base in this example). + * @param event_id The id for the received event. + * @param event_data The data for the event, esp_mqtt_event_handle_t. + */ +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%d", base, event_id); + esp_mqtt_event_handle_t event = event_data; + // unused: esp_mqtt_client_handle_t client = event->client; + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); + break; + case MQTT_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); + break; + + case MQTT_EVENT_SUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id); + break; + + case MQTT_EVENT_UNSUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); + break; + + case MQTT_EVENT_PUBLISHED: + ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); + break; + + case MQTT_EVENT_DATA: + ESP_LOGI(TAG, "MQTT_EVENT_DATA"); + printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); + printf("DATA=%.*s\r\n", event->data_len, event->data); + break; + + case MQTT_EVENT_ERROR: + ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); + if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) { + log_error_if_nonzero("reported from esp-tls", event->error_handle->esp_tls_last_esp_err); + log_error_if_nonzero("reported from tls stack", event->error_handle->esp_tls_stack_err); + log_error_if_nonzero("captured as transport's socket errno", event->error_handle->esp_transport_sock_errno); + ESP_LOGI(TAG, "Last errno string (%s)", strerror(event->error_handle->esp_transport_sock_errno)); + + } + break; + + default: + ESP_LOGI(TAG, "Other event id:%d", event->event_id); + break; + } +} diff --git a/ADIS_ESP32_Eclipse/main/myMqtt.h b/ADIS_ESP32_Eclipse/main/myMqtt.h new file mode 100644 index 0000000..b5324d2 --- /dev/null +++ b/ADIS_ESP32_Eclipse/main/myMqtt.h @@ -0,0 +1,21 @@ +/* + * myMqtt.h + * + * Created on: 25.11.2022 + * Author: jonas + */ + +#ifndef MAIN_MYMQTT_H_ +#define MAIN_MYMQTT_H_ + +#include + +bool MyMqtt_Init(void); + +void MyMqtt_Deinit(void); + +void MyMqtt_Publish(const char *topic, const char *data); + +void MyMqtt_Subscribe(const char *topic); + +#endif /* MAIN_MYMQTT_H_ */ diff --git a/ADIS_ESP32_Eclipse/main/platform.c b/ADIS_ESP32_Eclipse/main/platform.c index 660df67..a260af0 100644 --- a/ADIS_ESP32_Eclipse/main/platform.c +++ b/ADIS_ESP32_Eclipse/main/platform.c @@ -53,6 +53,7 @@ #include "McuCriticalSection.h" #include "esp32_mac.h" #include "rs485.h" +#include "application.c" void PL_Init(void) { McuLib_Init(); @@ -104,4 +105,7 @@ void PL_Init(void) { #if PL_CONFIG_USE_ROBO_REMOTE ROBOT_Init(); #endif +#if PL_CONFIG_APPLICATION_ACTIVATED + Application_Start(); +#endif } diff --git a/ADIS_ESP32_Eclipse/main/platform.h b/ADIS_ESP32_Eclipse/main/platform.h index 89d4a7a..001429f 100644 --- a/ADIS_ESP32_Eclipse/main/platform.h +++ b/ADIS_ESP32_Eclipse/main/platform.h @@ -17,10 +17,12 @@ #define PL_CONFIG_USE_SHELL (1) /*!< implements shell between robot and ESP32 */ #define PL_CONFIG_USE_RS485 (1) /*!< ESP32 using RS-485 to split-flaps */ -#define PL_CONFIG_USE_SNTP_TIME (0 && PL_CONFIG_USE_WIFI) +#define PL_CONFIG_USE_SNTP_TIME (1 && PL_CONFIG_USE_WIFI) #define PL_CONFIG_USE_TIME_DATE (1) /*!< if using Time and Date information */ #define PL_CONFIG_USE_ROBO_REMOTE (1 && PL_CONFIG_USE_UDP_SERVER) /* UDP Remote controller for robot */ +#define PL_CONFIG_APPLICATION_ACTIVATED (1) + /*! \brief Module and platform initialization */ void PL_Init(void);