From 3b813c01a490d6cf33a4e2bdf6994bf6fdfe1418 Mon Sep 17 00:00:00 2001 From: Koki Shinjo Date: Tue, 15 Oct 2024 12:29:33 +0900 Subject: [PATCH] update --- .../enr_message_board/include/message.h | 72 --------- .../.gitignore | 0 .../README.md | 0 .../data/config.json | 0 .../include/README | 0 sketchbooks/sdp_message_board/include/epd.h | 24 +++ .../sdp_message_board/include/message.h | 36 +++++ .../lib/README | 0 .../lib/arduino_lib | 0 .../lib/ros_lib | 0 .../platformio.ini | 0 .../src/main.cpp | 142 ++++++++++-------- .../test/README | 0 13 files changed, 140 insertions(+), 134 deletions(-) delete mode 100644 sketchbooks/enr_message_board/include/message.h rename sketchbooks/{enr_message_board => sdp_message_board}/.gitignore (100%) rename sketchbooks/{enr_message_board => sdp_message_board}/README.md (100%) rename sketchbooks/{enr_message_board => sdp_message_board}/data/config.json (100%) rename sketchbooks/{enr_message_board => sdp_message_board}/include/README (100%) create mode 100644 sketchbooks/sdp_message_board/include/epd.h create mode 100644 sketchbooks/sdp_message_board/include/message.h rename sketchbooks/{enr_message_board => sdp_message_board}/lib/README (100%) rename sketchbooks/{enr_message_board => sdp_message_board}/lib/arduino_lib (100%) rename sketchbooks/{enr_message_board => sdp_message_board}/lib/ros_lib (100%) rename sketchbooks/{enr_message_board => sdp_message_board}/platformio.ini (100%) rename sketchbooks/{enr_message_board => sdp_message_board}/src/main.cpp (57%) rename sketchbooks/{enr_message_board => sdp_message_board}/test/README (100%) diff --git a/sketchbooks/enr_message_board/include/message.h b/sketchbooks/enr_message_board/include/message.h deleted file mode 100644 index 4b177c3a..00000000 --- a/sketchbooks/enr_message_board/include/message.h +++ /dev/null @@ -1,72 +0,0 @@ -#include - -#include -#include - -#include "sdp/packet_creator.h" -#include "sdp/packet_parser.h" - -class Message { - public: - inline static std::string packet_description_write = "Message Board to write"; - inline static std::string serialization_format_write = "siS"; - inline static std::string packet_description_message = "Message Board message"; - - char message[64]; - char source_name[64]; - unsigned long deadline; - - Message(const uint8_t *data) { - strncpy(this->source_name, "None", 16); - strncpy(this->source_name, "None", 64); - this->deadline = 0; - - if (get_packet_type(data) == smart_device_protocol::Packet::PACKET_TYPE_DEVICE_MESSAGE_BOARD_DATA) { - uint16_t packet_type; - uint64_t timeout_duration; - parse_packet_as_message_board_data_packet(data, packet_type, source_name, timeout_duration, message); - this->deadline = millis() + timeout_duration; - } else if (get_packet_type(data) == smart_device_protocol::Packet::PACKET_TYPE_DATA) { - auto ret = parse_packet_as_data_packet(data); - SDPInterfaceDescription packet_description_and_serialization_format = std::get<0>(ret); - std::string packet_description = std::get<0>(packet_description_and_serialization_format); - std::string serialization_format = std::get<1>(packet_description_and_serialization_format); - std::vector data = std::get<1>(ret); - - if (packet_description == packet_description_write and serialization_format == serialization_format_write and get_serialization_format(data) == serialization_format_write) { - std::string source_name = std::get(data[0]); - int32_t duration_until_deletion = std::get(data[1]); - std::string message = std::get(data[2]); - strncpy(this->source_name, source_name.c_str(), 16); - strncpy(this->message, message.c_str(), 64); - this->deadline = millis() + duration_until_deletion; - } - } - } - - Message(char *source_name, char *message, int32_t timeout_duration) { - strncpy(this->source_name, source_name, 16); - strncpy(this->message, message, 64); - this->deadline = (int32_t)millis() + timeout_duration; - } - - void to_v1_packet(uint8_t *data) { - create_device_message_board_data_packet(data, source_name, deadline - millis(), message); - } - - void to_v2_packet(uint8_t *data) { - std::vector> data_vector; - data_vector.push_back(std::variant(std::string(source_name))); - data_vector.push_back(std::variant((int32_t)(this->deadline - millis()))); - data_vector.push_back(std::variant(std::string(message))); - generate_data_frame(data, packet_description_message.c_str(), data_vector); - } - - static void generate_v2_meta_packet(uint8_t *data, const char *device_name) { - generate_meta_frame(data, device_name, packet_description_write.c_str(), serialization_format_write.c_str(), "", "", "", ""); - } - - static SDPInterfaceDescription get_interface_description() { - return std::make_tuple(packet_description_message, serialization_format_write); - } -}; diff --git a/sketchbooks/enr_message_board/.gitignore b/sketchbooks/sdp_message_board/.gitignore similarity index 100% rename from sketchbooks/enr_message_board/.gitignore rename to sketchbooks/sdp_message_board/.gitignore diff --git a/sketchbooks/enr_message_board/README.md b/sketchbooks/sdp_message_board/README.md similarity index 100% rename from sketchbooks/enr_message_board/README.md rename to sketchbooks/sdp_message_board/README.md diff --git a/sketchbooks/enr_message_board/data/config.json b/sketchbooks/sdp_message_board/data/config.json similarity index 100% rename from sketchbooks/enr_message_board/data/config.json rename to sketchbooks/sdp_message_board/data/config.json diff --git a/sketchbooks/enr_message_board/include/README b/sketchbooks/sdp_message_board/include/README similarity index 100% rename from sketchbooks/enr_message_board/include/README rename to sketchbooks/sdp_message_board/include/README diff --git a/sketchbooks/sdp_message_board/include/epd.h b/sketchbooks/sdp_message_board/include/epd.h new file mode 100644 index 00000000..5d5329f5 --- /dev/null +++ b/sketchbooks/sdp_message_board/include/epd.h @@ -0,0 +1,24 @@ +#include + +void clear_canvas(M5EPD_Canvas &canvas) { + canvas.clear(); + canvas.setCursor(0, 0); +} + +void init_epd(M5EPD_Canvas &canvas_title, M5EPD_Canvas &canvas_status, M5EPD_Canvas &canvas_message) { + canvas_title.createCanvas(540, 100); + canvas_status.createCanvas(540, 60); + canvas_message.createCanvas(540, 800); + canvas_title.setTextSize(3); + canvas_status.setTextSize(2); + canvas_message.setTextSize(2); + clear_canvas(canvas_title); + clear_canvas(canvas_status); + clear_canvas(canvas_message); +} + +void update_epd(M5EPD_Canvas &canvas_title, M5EPD_Canvas &canvas_status, M5EPD_Canvas &canvas_message) { + canvas_title.pushCanvas(0, 0, UPDATE_MODE_DU4); + canvas_status.pushCanvas(0, 100, UPDATE_MODE_DU4); + canvas_message.pushCanvas(0, 160, UPDATE_MODE_DU4); +} diff --git a/sketchbooks/sdp_message_board/include/message.h b/sketchbooks/sdp_message_board/include/message.h new file mode 100644 index 00000000..099f1286 --- /dev/null +++ b/sketchbooks/sdp_message_board/include/message.h @@ -0,0 +1,36 @@ +#include + +#include +#include + +#include "sdp/packet_creator.h" +#include "sdp/packet_parser.h" + +class Message { + public: + inline static std::string packet_description_write = "Message Board to write"; + inline static std::string serialization_format_write = "siS"; + inline static std::string packet_description_message = "Message Board message"; + + char message[64]; + char source_name[64]; + unsigned long deadline; + + Message(char *source_name, char *message, int32_t timeout_duration) { + strncpy(this->source_name, source_name, 16); + strncpy(this->message, message, 64); + this->deadline = (int32_t)millis() + timeout_duration; + } + + void to_v2_packet(uint8_t *data) { + std::vector> data_vector; + data_vector.push_back(std::variant(std::string(source_name))); + data_vector.push_back(std::variant((int32_t)(this->deadline - millis()))); + data_vector.push_back(std::variant(std::string(message))); + generate_data_frame(data, packet_description_message.c_str(), data_vector); + } + + static SDPInterfaceDescription get_interface_description() { + return std::make_tuple(packet_description_message, serialization_format_write); + } +}; diff --git a/sketchbooks/enr_message_board/lib/README b/sketchbooks/sdp_message_board/lib/README similarity index 100% rename from sketchbooks/enr_message_board/lib/README rename to sketchbooks/sdp_message_board/lib/README diff --git a/sketchbooks/enr_message_board/lib/arduino_lib b/sketchbooks/sdp_message_board/lib/arduino_lib similarity index 100% rename from sketchbooks/enr_message_board/lib/arduino_lib rename to sketchbooks/sdp_message_board/lib/arduino_lib diff --git a/sketchbooks/enr_message_board/lib/ros_lib b/sketchbooks/sdp_message_board/lib/ros_lib similarity index 100% rename from sketchbooks/enr_message_board/lib/ros_lib rename to sketchbooks/sdp_message_board/lib/ros_lib diff --git a/sketchbooks/enr_message_board/platformio.ini b/sketchbooks/sdp_message_board/platformio.ini similarity index 100% rename from sketchbooks/enr_message_board/platformio.ini rename to sketchbooks/sdp_message_board/platformio.ini diff --git a/sketchbooks/enr_message_board/src/main.cpp b/sketchbooks/sdp_message_board/src/main.cpp similarity index 57% rename from sketchbooks/enr_message_board/src/main.cpp rename to sketchbooks/sdp_message_board/src/main.cpp index 66ae22d1..28905dfb 100644 --- a/sketchbooks/enr_message_board/src/main.cpp +++ b/sketchbooks/sdp_message_board/src/main.cpp @@ -8,13 +8,14 @@ #include #include "devices/uwb_module_util.h" +#include "epd.h" #include "m5stack_utils/m5paper.h" #include "message.h" #include "sdp/sdp.h" #include "utils/config_loader.h" // CONFIG -String device_name = "msg_board"; +String device_name; // CANVAS M5EPD_Canvas canvas_title(&M5.EPD); @@ -25,6 +26,7 @@ M5EPD_Canvas canvas_message(&M5.EPD); int uwb_id = -1; std::string packet_description_uwb = "UWB Station"; std::string serialization_format_uwb = "i"; +SDPInterfaceDescription interface_description_uwb = std::make_tuple(packet_description_uwb, serialization_format_uwb); std::vector data_for_uwb_data_packet; // SDP @@ -36,15 +38,6 @@ std::vector message_board; // Others int loop_counter = 0; -void OnDataRecvV1(const uint8_t *mac_addr, const uint8_t *data, int data_len) { - uint8_t packet_type = get_packet_type(data); - if (packet_type == smart_device_protocol::Packet::PACKET_TYPE_DEVICE_MESSAGE_BOARD_DATA) { - auto m = Message(data); - message_board.push_back(m); - Serial.printf("Push message from V1 Data\n"); - } -} - void callback_for_v2(const uint8_t *mac_addr, const std::vector &body) { std::string source_name = std::get(body[0]); int32_t duration_until_deletion = std::get(body[1]); @@ -55,43 +48,23 @@ void callback_for_v2(const uint8_t *mac_addr, const std::vector &body) Serial.printf("Push message from V2 Data\n"); } -void load_config() { +bool load_config(fs::FS &fs, const String &filename) { StaticJsonDocument<1024> doc; - if (not load_json_from_FS<1024>(SD, "/config.json", doc)) { - return; + if (not load_json_from_FS<1024>(fs, filename, doc)) { + return false; + } + if (not doc.containsKey("device_name") or + not doc.containsKey("uwb_id")) { + return false; } - if (doc.containsKey("device_name")) - device_name = doc["device_name"].as(); - if (doc.containsKey("uwb_id")) - uwb_id = doc["uwb_id"].as(); -} - -void clear_canvas(M5EPD_Canvas &canvas) { - canvas.clear(); - canvas.setCursor(0, 0); -} -void init_epd(M5EPD_Canvas &canvas_title, M5EPD_Canvas &canvas_status, M5EPD_Canvas &canvas_message) { - canvas_title.createCanvas(540, 100); - canvas_status.createCanvas(540, 60); - canvas_message.createCanvas(540, 800); - canvas_title.setTextSize(3); - canvas_status.setTextSize(2); - canvas_message.setTextSize(2); - clear_canvas(canvas_title); - clear_canvas(canvas_status); - clear_canvas(canvas_message); -} + device_name = doc["device_name"].as(); + uwb_id = doc["uwb_id"].as(); -void update_epd(M5EPD_Canvas &canvas_title, M5EPD_Canvas &canvas_status, M5EPD_Canvas &canvas_message) { - canvas_title.pushCanvas(0, 0, UPDATE_MODE_DU4); - canvas_status.pushCanvas(0, 100, UPDATE_MODE_DU4); - canvas_message.pushCanvas(0, 160, UPDATE_MODE_DU4); + return true; } void setup() { - esp_read_mac(mac_address, ESP_MAC_WIFI_STA); - // Init M5Paper M5.begin(false, true, true, true, false); M5.EPD.SetRotation(90); @@ -101,51 +74,90 @@ void setup() { Serial.println("Start init"); Serial1.begin(115200, SERIAL_8N1, M5StackSerialPortInfoList[PORT_C].rx, M5StackSerialPortInfoList[PORT_C].tx); + // EPD + canvas_title.printf("SDP MESSAGE BOARD\n"); + update_epd(canvas_title, canvas_status, canvas_message); + // Load config - load_config(); + if (not load_config(SD, "/config.json")) { + Serial.println("Failed to load config"); + canvas_status.printf("Failed to load config\n"); + update_epd(canvas_title, canvas_status, canvas_message); + while (true) { + delay(1000); + } + } + Serial.println("Config loaded"); + clear_canvas(canvas_status); + canvas_status.printf("Config loaded\n"); + update_epd(canvas_title, canvas_status, canvas_message); + + // Show device name + canvas_title.printf("Name: %s\n", device_name.c_str()); + update_epd(canvas_title, canvas_status, canvas_message); // Init SDP - init_sdp(mac_address, device_name); - register_sdp_esp_now_recv_callback(OnDataRecvV1); - register_sdp_interface_callback(Message::get_interface_description(), callback_for_v2); + if (not init_sdp(mac_address, device_name)) { + Serial.println("Failed to initialize SDP"); + canvas_status.printf("Failed to initialize SDP\n"); + update_epd(canvas_title, canvas_status, canvas_message); + while (true) { + delay(1000); + } + } + if (not register_sdp_interface_callback(Message::get_interface_description(), callback_for_v2)) { + Serial.println("Failed to register callback for V2"); + canvas_status.printf("Failed to register callback for V2\n"); + update_epd(canvas_title, canvas_status, canvas_message); + while (true) { + delay(1000); + } + } Serial.println("SDP Initialized!"); + clear_canvas(canvas_status); + canvas_status.printf("SDP Initialized!\n"); + update_epd(canvas_title, canvas_status, canvas_message); + + // Show Address + canvas_title.printf("ADDR: %2x:%2x:%2x:%2x:%2x:%2x\n", + mac_address[0], mac_address[1], + mac_address[2], mac_address[3], + mac_address[4], mac_address[5]); + Serial.printf("ADDR: %2x:%2x:%2x:%2x:%2x:%2x\n", + mac_address[0], mac_address[1], + mac_address[2], mac_address[3], + mac_address[4], mac_address[5]); + update_epd(canvas_title, canvas_status, canvas_message); // UWB Initialized - if (uwb_id >= 0 ) { + if (uwb_id >= 0) { bool result = initUWB(false, uwb_id, Serial1); data_for_uwb_data_packet.clear(); data_for_uwb_data_packet.push_back(SDPData(uwb_id)); if (result) { Serial.println("Success for initialization of UWB"); + Serial.printf("UWB_ID: %d\n", uwb_id); + canvas_title.printf("UWB_ID: %d\n", uwb_id); } else { uwb_id = -1; resetUWB(Serial1); Serial.println("Failed to initialize UWB"); + canvas_title.printf("Failed to initialize UWB\n"); } } else { resetUWB(Serial1); Serial.println("UWB is not used"); + canvas_title.printf("UWB is not used\n"); } - - // Show device info - canvas_title.printf("ENR & SDP MESSAGE BOARD\n"); - canvas_title.printf("Name: %s\n", device_name.c_str()); - canvas_title.printf("ADDR: %2x:%2x:%2x:%2x:%2x:%2x\n", - mac_address[0], mac_address[1], - mac_address[2], mac_address[3], - mac_address[4], mac_address[5]); - canvas_title.printf("UWB_ID: %d\n", uwb_id); update_epd(canvas_title, canvas_status, canvas_message); + + delay(3000); } void loop() { Serial.printf("Loop %d\n", loop_counter); uint8_t buf[250]; - // Manually Send V1 Meta Packet - create_device_message_board_meta_packet(buf, device_name.c_str()); - broadcast_sdp_esp_now_packet((uint8_t *)buf, sizeof(buf)); - // Show Battery voltage uint32_t battery_voltage = M5.getBatteryVoltage(); clear_canvas(canvas_status); @@ -155,7 +167,7 @@ void loop() { canvas_status.printf("x Battery: %u\n", battery_voltage); } - // Shoe messages + // Show messages and send SDP packet clear_canvas(canvas_message); for (auto m = message_board.begin(); m != message_board.end();) { if (millis() > m->deadline) { @@ -170,15 +182,21 @@ void loop() { canvas_message.printf("Duration until deletion(sec): %d\n", (int)((m->deadline - millis()) / 1000)); canvas_message.printf("Message: %s\n\n", m->message); - m->to_v1_packet(buf); - broadcast_sdp_esp_now_packet((uint8_t *)buf, sizeof(buf)); - delay(10); m->to_v2_packet(buf); broadcast_sdp_esp_now_packet((uint8_t *)buf, sizeof(buf)); delay(10); } update_epd(canvas_title, canvas_status, canvas_message); + // Send UWB packet + if (uwb_id >= 0) { + if (not send_sdp_data_packet(interface_description_uwb, data_for_uwb_data_packet)) { + Serial.println("Failed to send UWB packet"); + canvas_status.printf("Failed to send UWB packet\n"); + update_epd(canvas_title, canvas_status, canvas_message); + } + } + delay(100); loop_counter++; } diff --git a/sketchbooks/enr_message_board/test/README b/sketchbooks/sdp_message_board/test/README similarity index 100% rename from sketchbooks/enr_message_board/test/README rename to sketchbooks/sdp_message_board/test/README