Création du module DolibarrClient avec ses différentes routes & création du module WarehouseGUI pour le LCD M5Stack #7

Merged
Clement merged 9 commits from feat/client_dolibarr into develop 2023-11-10 15:47:41 +00:00
9 changed files with 53 additions and 86 deletions
Showing only changes of commit 3d94d4d803 - Show all commits

View File

@ -10,11 +10,7 @@ monitor_speed = 115200
; notworthy ones:
; __PLATFORMIO_BUILD_DEBUG__ = debug mode
build_flags =
-std=c++17
; DO NOT TOUCH --- START
Nicolas marked this conversation as resolved Outdated

vraiment utile @Nicolas ?

vraiment utile @Nicolas ?
-D MONITOR_SPEED=${config.monitor_speed}
; DO NOT TOUCH --- END
-D EXAMPLE_NUMBER=69
-D EXAMPLE_STRING=\"Pouet\"
-D WAITING_WIFI_DELAY=1000

10
config_api.ini Normal file
View File

@ -0,0 +1,10 @@
[config_api]
build_flags =
-D API_LOGIN_URL=\"/users/info\"
-D API_LIST_PRODUCT_URL=\"/products/\"
-D API_GET_PRODUCT_URL=\"/products/{id}/\"
-D API_GET_PRODUCT_STOCK_URL=\"/products/{id}/stock/\"
-D API_LIST_WAREHOUSE_URL=\"/warehouses/\"
-D API_LIST_STOCKS_MOVEMENTS_URL=\"/stockmovements/?sortfield=t.rowid\"
-D API_CREATE_STOCKS_MOVEMENTS_URL=\"/stockmovements/\"
-D API_MAX_JSON_SIZE=4096

View File

@ -1,10 +1,9 @@
#ifndef PROGRAM_H
#define PROGRAM_H
#define DEFAULT_BAUD_RATE 115200
#include "Arduino.h"
Nicolas marked this conversation as resolved Outdated

deja inclue dans les config

deja inclue dans les config
#include "DolibarrClient.h"
#include <M5Stack.h>
class Program {
public:

View File

@ -3,18 +3,12 @@
#include <ArduinoJson.h>
#include <iostream>
#define WAITING_WIFI_DELAY 1000
DolibarrClient::DolibarrClient(struct WifiConfig wifi_config, struct DolibarrConfig dolibarr_config) : wifi(wifi_config), dolibarr(dolibarr_config) {
DolibarrClient::DolibarrClient(struct DolibarrConfig dolibarr_config) : dolibarr(dolibarr_config) {
Nicolas marked this conversation as resolved Outdated

mettre en config

mettre en config
#if defined(DEBUG)
Serial.println(" --- Wifi configuration --- ");
Serial.println((std::string("SSID: ") + std::string(wifi_config.ssid)).c_str());
Serial.println((std::string("Password: ") + std::string(wifi_config.password)).c_str());
Serial.println(" --- Dolibarr configuration --- ");
Serial.println((std::string("Base URL: ") + std::string(dolibarr_config.url)).c_str());
Serial.println((std::string("Token: ") + std::string(dolibarr_config.api_key)).c_str());
#endif
this->initialize_wifi();
this->initialize_http_client();
}
@ -32,10 +26,10 @@ HTTPClient *DolibarrClient::build_url(const String& url) const {
int DolibarrClient::login() const {
HTTPClient *client = this->build_url(LOGIN_URL);
HTTPClient *client = this->build_url(API_LOGIN_URL);
int httpResponseCode = client->GET();
if (httpResponseCode > 0) {
StaticJsonDocument<LOGIN_JSON_SIZE> doc;
StaticJsonDocument<API_MAX_JSON_SIZE> doc;
DeserializationError error = deserializeJson(doc, client->getString().c_str());
if (error) {
delete client;
@ -48,24 +42,24 @@ int DolibarrClient::login() const {
return -1;
}
std::string replace_id(const char *str, const char *id) {
std::string url(str);
url.replace(url.find("{id}"), 4, id);
String replace_id(const char *str, const char *id) {
String url(str);
url.replace("{id}", id);
return url;
}
std::vector<models::Product> *DolibarrClient::list_products() const {
Nicolas marked this conversation as resolved
Review

utiliser les string d'Arduino

utiliser les string d'Arduino
HTTPClient *client = this->build_url(LIST_PRODUCT_URL);
if (client->GET() == OK_RESPONSE) {
HTTPClient *client = this->build_url(API_LIST_PRODUCT_URL);
if (client->GET() == HTTP_CODE_OK) {
}
return nullptr;
}
models::Product *DolibarrClient::get_product_by_id(const char* id_product) const {
HTTPClient *client = this->build_url(replace_id(GET_PRODUCT_URL, id_product).c_str());
if (client->GET() == OK_RESPONSE) {
StaticJsonDocument<GET_PRODUCT_JSON_SIZE> doc;
HTTPClient *client = this->build_url(replace_id(API_GET_PRODUCT_URL, id_product).c_str());
if (client->GET() == HTTP_CODE_OK) {
StaticJsonDocument<API_MAX_JSON_SIZE> doc;
DeserializationError error = deserializeJson(doc, client->getString().c_str());
if (error) {
Serial.println("ERROR: ");
@ -87,9 +81,9 @@ models::Product *DolibarrClient::get_product_by_id(const char* id_product) const
}
std::vector<models::Warehouse> *DolibarrClient::list_warehouse() const {
HTTPClient *client = this->build_url(LIST_WAREHOUSE_URL);
if (client->GET() == OK_RESPONSE) {
StaticJsonDocument<LIST_WAREHOUSE_JSON_SIZE> doc;
HTTPClient *client = this->build_url(API_LIST_WAREHOUSE_URL);
if (client->GET() == HTTP_CODE_OK) {
StaticJsonDocument<API_MAX_JSON_SIZE> doc;
DeserializationError error = deserializeJson(doc, client->getString().c_str());
if (error) {
Serial.println("ERROR: ");
@ -111,34 +105,21 @@ std::vector<models::Warehouse> *DolibarrClient::list_warehouse() const {
}
int DolibarrClient::create_movement(models::CreateProductStock &stock) const {
HTTPClient *client = this->build_url(CREATE_STOCKS_MOVEMENTS_URL);
StaticJsonDocument<CREATE_STOCKS_MOVEMENTS_JSON_SIZE> doc;
HTTPClient *client = this->build_url("API_CREATE_STOCKS_MOVEMENTS_URL");
StaticJsonDocument<API_MAX_JSON_SIZE> doc;
std::string result;
doc["product_id"] = stock.product_id;
doc["warehouse_id"] = stock.warehouse_id;
doc["qty"] = stock.qty;
serializeJson(doc, result);
Serial.println(result.c_str());
if (client->POST(result.c_str()) == OK_RESPONSE) {
if (client->POST(result.c_str()) == HTTP_CODE_OK) {
delete client;
return 0;
}
return -1;
}
int DolibarrClient::initialize_wifi() const {
WiFiClass::mode(WIFI_STA); //Optional
WiFi.setSleep(false);
WiFi.begin(this->wifi.ssid, this->wifi.password);
Serial.print("Connecting ");
while(WiFiClass::status() != WL_CONNECTED){
delay(WAITING_WIFI_DELAY);
Serial.print(".");
}
Serial.println("Connected to the WiFi network");
return 0;
}
int DolibarrClient::initialize_http_client() {
this->httpClient = new HTTPClient();
if (this->login() == 0) {

View File

@ -6,25 +6,6 @@
#include <vector>
#include "DolibarrModels.h"
constexpr u_int32_t OK_RESPONSE = 200;
constexpr u_int32_t CREATED_RESPONSE = 201;
constexpr u_int32_t NO_CONTENT_RESPONSE = 204;
constexpr u_int32_t LOGIN_JSON_SIZE = 4096;
constexpr const char* LOGIN_URL = "/users/info";
constexpr u_int32_t LIST_PRODUCT_JSON_SIZE = 4096;
constexpr const char* LIST_PRODUCT_URL = "/products/";
constexpr u_int32_t GET_PRODUCT_JSON_SIZE = 4096;
constexpr const char* GET_PRODUCT_URL = "/products/{id}/";
constexpr u_int32_t GET_PRODUCT_STOCK_JSON_SIZE = 4096;
constexpr const char* GET_PRODUCT_STOCK_URL = "/products/{id}/stock/";
constexpr u_int32_t LIST_WAREHOUSE_JSON_SIZE = 4096;
constexpr const char* LIST_WAREHOUSE_URL = "/warehouses/";
constexpr u_int32_t LIST_STOCKS_MOVEMENTS_JSON_SIZE = 4096;
constexpr const char* LIST_STOCKS_MOVEMENTS_URL = "/stockmovements/?sortfield=t.rowid&sortorder=ASC&limit=100";
constexpr u_int32_t CREATE_STOCKS_MOVEMENTS_JSON_SIZE = 4096;
constexpr const char* CREATE_STOCKS_MOVEMENTS_URL = "/stockmovements/";
struct WifiConfig {
const char* ssid;
const char* password;
@ -37,7 +18,7 @@ struct DolibarrConfig {
class DolibarrClient {
public:
DolibarrClient(WifiConfig wifi_config, DolibarrConfig dolibarr_config);
DolibarrClient(DolibarrConfig dolibarr_config);
~DolibarrClient() = default;
int login() const;
std::vector<models::Warehouse> *list_warehouse() const;
@ -46,9 +27,7 @@ public:
int create_movement(models::CreateProductStock &stock) const;
private:
HTTPClient* httpClient{};
struct WifiConfig wifi;
struct DolibarrConfig dolibarr;
int initialize_wifi() const;
int initialize_http_client();
HTTPClient *build_url(const String& url) const;
};

View File

@ -1,5 +0,0 @@
//
// Created by nico on 15/09/23.
//
#include "DolibarrModels.h"

View File

@ -17,13 +17,14 @@ extra_configs =
secrets.ini
config.ini
envs.ini
config_api.ini
; Cache folder
build_cache_dir = ./.pio/cache
[env]
; build Envs
build_flags = ${config.build_flags} ${secrets.build_flags}
build_flags = ${config.build_flags} ${secrets.build_flags} ${config_api.build_flags}
; Add scripts for more functionnalities
; see individual scripts for more informations
@ -50,9 +51,9 @@ upload_speed = 921600
; librairies (make sure to fix versions where possible!)
lib_deps =
Nicolas marked this conversation as resolved Outdated

mettre un commentaire sur chaque ligne pour dire l'utilité de la lib

mettre un commentaire sur chaque ligne pour dire l'utilité de la lib
bblanchon/ArduinoJson@^6.21.3
m5stack/M5Stack@^0.4.5
m5stack/M5GFX@^0.1.9
bblanchon/ArduinoJson@^6.21.3 ; JSON serializer et deserializer
m5stack/M5Stack@^0.4.5 ; M5 Lib
m5stack/M5GFX@^0.1.9 ; M5 Lib pour le LCD
; example:
; erropix/ESP32 AnalogWrite@0.2

View File

@ -2,11 +2,28 @@
#include "Arduino.h"
#include "DolibarrClient.h"
int initialize_wifi(WifiConfig wifi) {
WiFiClass::mode(WIFI_STA); //Optional
WiFi.setSleep(false);
WiFi.begin(wifi.ssid, wifi.password);
Serial.print("Connecting ");
while(WiFiClass::status() != WL_CONNECTED){
delay(WAITING_WIFI_DELAY);
Serial.print(".");
}
Serial.println("Connected to the WiFi network");
return 0;
}
Program::Program() {
Nicolas marked this conversation as resolved Outdated

remettre le serial print comme c'était

remettre le serial print comme c'était
Serial.begin(MONITOR_SPEED);
struct WifiConfig wifi_c = {WIFI_SSID, WIFI_PASSWORD};
struct DolibarrConfig dolibarr = {DOLIBARR_URL, DOLIBARR_API_TOKEN};
this->client = new DolibarrClient(wifi_c, dolibarr);
initialize_wifi(wifi_c);
this->client = new DolibarrClient(dolibarr);
}
void Program::loop() {
}

View File

@ -1,19 +1,8 @@
#include "Program.h"
#include "Arduino.h"
#include "WarehouseGUI.h"
#include <M5Stack.h>
Program* program;
void setup() {
Serial.begin(DEFAULT_BAUD_RATE);
program = new Program();
#if defined(DEBUG)
Serial.println("Hello World");
#endif
}
void loop() {
Nicolas marked this conversation as resolved
Review

le main.cpp doit téoriquement rester par defaut

le main.cpp doit téoriquement rester par defaut