diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index cda779c..bb98268 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -20,16 +20,8 @@ RUN RUN set -eux; \ RUN set -eux; \ apt-get update; \ apt-get install -y \ - libncurses-dev \ - libmicrohttpd-dev \ libcurl4-openssl-dev \ - zlib1g-dev \ - prometheus-cpp-dev \ - nlohmann-json3-dev - -RUN set -eux; \ - apt-get update; \ - apt-get install -y \ + nlohmann-json3-dev \ libpaho-mqtt-dev RUN set -eux; \ @@ -42,13 +34,6 @@ RUN set -eux; \ cmake --build . --target install; \ ldconfig; -RUN set -eux; \ - apt-get update; \ - apt-get install -y \ - librabbitmq4 \ - librabbitmq-dev;\ - apt-get clean - USER $USERNAME WORKDIR /workspace diff --git a/CMakeLists.txt b/CMakeLists.txt index 866dc7f..12a2476 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,40 +20,19 @@ add_executable(pompes # CURL find_package(CURL REQUIRED) -# Microhttpd -find_library(MICROHTTPD_LIB microhttpd REQUIRED) - # Threads et compression find_package(Threads REQUIRED) -find_library(Z_LIB z REQUIRED) - -# ncursesw -find_library(NCURSESW_LIB ncursesw REQUIRED) - -# RabbitMQ C client -find_library(RABBITMQ_LIB rabbitmq REQUIRED) # Paho MQTT C client find_library(PAHO_MQTTPP3_LIB paho-mqttpp3 REQUIRED) find_library(PAHO_MQTT3C_LIB paho-mqtt3c REQUIRED) -# ------------------------------- -# Prometheus C++ -# ------------------------------- -find_package(prometheus-cpp REQUIRED) - # ------------------------------- # Lien des bibliothèques # ------------------------------- target_link_libraries(pompes - prometheus-cpp::core - prometheus-cpp::pull ${CURL_LIBRARIES} - ${MICROHTTPD_LIB} Threads::Threads - ${Z_LIB} - ${NCURSESW_LIB} - ${RABBITMQ_LIB} ${PAHO_MQTT3C_LIB} # dépendance C ${PAHO_MQTTPP3_LIB} # lib C++ ) diff --git a/autom.cpp b/autom.cpp index 0c11a82..547a822 100644 --- a/autom.cpp +++ b/autom.cpp @@ -56,6 +56,8 @@ int s0, s1, s2, s3, s4, s5, s6, s7; int m0, m1, m2, m3; int v0; +void process(); + /* ******************************************************** * MQTT * * * @@ -70,35 +72,12 @@ const int CYCLE_MS = 100; mqtt::async_client client(ADDRESS, CLIENTID); -void mqtt_process(mqtt::async_client* client) -{ - json obj = { - {"s0", s0 }, - {"s1", s1 }, - {"s2", s2 }, - {"s3", s3 }, - {"s4", s4 }, - {"s5", s5 }, - {"s6", s6 }, - {"s7", s7 }, - {"m0", m0 }, - {"m1", m1 }, - {"m2", m2 }, - {"m3", m3 }, - }; - - std::string payload = obj.dump(); - auto msg = mqtt::make_message("geii/out", payload); - msg->set_qos(1); - client->publish(msg); - - usleep(100000); -} - +void mqtt_send(mqtt::async_client *client); // Réception des messages MQTT // ************************************************************ -class callback : public virtual mqtt::callback { +class callback : public virtual mqtt::callback +{ public: void message_arrived(mqtt::const_message_ptr msg) override { std::string payload = msg->to_string(); @@ -115,28 +94,37 @@ public: if (j.contains("marche")) marche = j["marche"].get() != 0; if (j.contains("arret")) arret = j["arret"].get() != 0; - if (j.contains("b0")) b0 = j["b0"].get() != 0; - if (j.contains("b1")) b1 = j["b1"].get() != 0; - if (j.contains("b2")) b2 = j["b2"].get() != 0; - if (j.contains("b3")) b3 = j["b3"].get() != 0; - if (j.contains("b4")) b4 = j["b4"].get() != 0; - if (j.contains("b5")) b5 = j["b5"].get() != 0; - if (j.contains("b6")) b6 = j["b6"].get() != 0; - if (j.contains("b7")) b7 = j["b7"].get() != 0; + if (j.contains("b0") && j["b0"].is_number()) + b0 = j["b0"].get(); + if (j.contains("b1") && j["b1"].is_number()) + b1 = j["b1"].get(); + if (j.contains("b2") && j["b2"].is_number()) + b2 = j["b2"].get(); + if (j.contains("b3") && j["b3"].is_number()) + b3 = j["b3"].get(); + if (j.contains("b4") && j["b4"].is_number()) + b4 = j["b4"].get(); + if (j.contains("b5") && j["b5"].is_number()) + b5 = j["b5"].get(); + if (j.contains("b6") && j["b6"].is_number()) + b6 = j["b6"].get(); + if (j.contains("b7") && j["b7"].is_number()) + b7 = j["b7"].get(); - if (j.contains("i0")) i0 = j["i0"].get() != 0; - if (j.contains("i1")) i1 = j["i1"].get() != 0; - if (j.contains("i2")) i2 = j["i2"].get() != 0; - if (j.contains("i3")) i3 = j["i3"].get() != 0; - if (j.contains("i4")) i4 = j["i4"].get() != 0; - if (j.contains("i5")) i5 = j["i5"].get() != 0; - if (j.contains("i6")) i6 = j["i6"].get() != 0; - if (j.contains("i7")) i7 = j["i7"].get() != 0; + if (j.contains("i0")) i0 = j["i0"].get(); + if (j.contains("i1")) i1 = j["i1"].get(); + if (j.contains("i2")) i2 = j["i2"].get(); + if (j.contains("i3")) i3 = j["i3"].get(); + if (j.contains("i4")) i4 = j["i4"].get(); + if (j.contains("i5")) i5 = j["i5"].get(); + if (j.contains("i6")) i6 = j["i6"].get(); + if (j.contains("i7")) i7 = j["i7"].get(); if (j.contains("v0") && j["v0"].is_number()) v0 = j["v0"].get(); - std::cout << "Pompes : " << marche << " " << arret << " B " << b0 << " " << b1 << " " << b2 << " " << b3 << " " << b4 << " " << b5 << " " << b6 << " " << b7 << " I " << i0 << " " << i1 << " " << i2 << " " << i3 << " " << i4 << " " << i5 << " " << i6 << " " << i7 << " " << v0 << std::endl; - } + process(); + mqtt_send(&client); + } catch (const json::parse_error& e) { std::cerr << "Erreur JSON : " << e.what() << "\n"; } @@ -162,6 +150,29 @@ void mqtt_open(mqtt::async_client* client) { } +void mqtt_send(mqtt::async_client *client) +{ + json obj = { + {"s0", s0}, + {"s1", s1}, + {"s2", s2}, + {"s3", s3}, + {"s4", s4}, + {"s5", s5}, + {"s6", s6}, + {"s7", s7}, + {"m0", m0}, + {"m1", m1}, + {"m2", m2}, + {"m3", m3}, + }; + + std::string payload = obj.dump(); + auto msg = mqtt::make_message("geii/out", payload); + msg->set_qos(1); + client->publish(msg); +} + void mqtt_close() { try { client.unsubscribe(TOPIC)->wait(); diff --git a/main.cpp b/main.cpp index 0a33dcc..8950aec 100644 --- a/main.cpp +++ b/main.cpp @@ -1,21 +1,78 @@ #include "main.hpp" #include "autom.cpp" +#include +#include + +int marche_precedent = 0; +int marche_frontmontant = 0; + +int arret_precedent = 1; +int arret_frontdescedant = 0; + +int b0_precedent = 0; +int b0_frontmontant = 0; +int b1_precedent = 0; +int b1_frontmontant = 0; +int b2_precedent = 0; +int b2_frontmontant = 0; +int b3_precedent = 0; +int b3_frontmontant = 0; +int b4_precedent = 0; +int b4_frontmontant = 0; +int b5_precedent = 0; +int b5_frontmontant = 0; +int b6_precedent = 0; +int b6_frontmontant = 0; +int b7_precedent = 0; +int b7_frontmontant = 0; int main() { mqtt_open(&client); - while (1) + std::atomic running{true}; + + while (running) { - // Début du code - // ***************************************************** - - // ***************************************************** - // Fin du code - - mqtt_process(&client); + std::this_thread::sleep_for(std::chrono::seconds(1)); } mqtt_close(); return 0; } + +void process() { + + // Détection du front montant (état courant supérieur à l'état précédent) + b0_frontmontant = b0 > b0_precedent; + b1_frontmontant = b1 > b1_precedent; + b2_frontmontant = b2 > b2_precedent; + b3_frontmontant = b3 > b3_precedent; + b4_frontmontant = b4 > b4_precedent; + b5_frontmontant = b5 > b5_precedent; + b6_frontmontant = b6 > b6_precedent; + b7_frontmontant = b7 > b7_precedent; + + s0 = i0; + + if (b1_frontmontant == 1) + { + s1 = !s1; // Inversion + } + + if (b2_frontmontant == 1) + { + s2 = !s2; // Inversion + } + + // Prêt pour un nouveau tour + // L'état courant devient l'état précédent + b0_precedent = b0; + b1_precedent = b1; + b2_precedent = b2; + b3_precedent = b3; + b4_precedent = b4; + b5_precedent = b5; + b6_precedent = b6; + b7_precedent = b7; +}