From d8b26ece66c9873c0e1fcdb7ece78528c40dce40 Mon Sep 17 00:00:00 2001
From: Matthias Ringwald <matthias@ringwald.ch>
Date: Sun, 29 Mar 2020 22:05:55 +0200
Subject: [PATCH] mesh: extract mesh_upper_transport_message builder from
 mesh_access_message builder

---
 src/mesh/mesh_access.c          | 32 +++-------------
 src/mesh/mesh_upper_transport.c | 66 +++++++++++++++++++++++++++++++++
 2 files changed, 71 insertions(+), 27 deletions(-)

diff --git a/src/mesh/mesh_access.c b/src/mesh/mesh_access.c
index 31e71dc99..ad68d5bae 100644
--- a/src/mesh/mesh_access.c
+++ b/src/mesh/mesh_access.c
@@ -54,6 +54,7 @@
 #include "mesh/mesh_proxy.h"
 #include "mesh/mesh_upper_transport.h"
 #include "mesh/mesh.h"
+#include "mesh_upper_transport.h"
 
 #define MEST_TRANSACTION_TIMEOUT_MS  6000
 
@@ -616,28 +617,10 @@ static int mesh_access_setup_opcode(uint8_t * buffer, uint32_t opcode){
 }
 
 // mesh_message_t builder
-
-// returns true if successful
 bool mesh_access_message_add_data(mesh_upper_transport_pdu_t * pdu, const uint8_t * data, uint16_t data_len){
-    uint16_t bytes_current_segment = 0;
-    mesh_network_pdu_t * network_pdu = (mesh_network_pdu_t *) btstack_linked_list_get_last_item(&pdu->segments);
-    if (network_pdu){
-        bytes_current_segment = MESH_NETWORK_PAYLOAD_MAX - network_pdu->len;
-    }
-    while (data_len > 0){
-        if (bytes_current_segment == 0){
-            network_pdu = (mesh_network_pdu_t *) mesh_network_pdu_get();
-            if (network_pdu == NULL) return false;
-            btstack_linked_list_add_tail(&pdu->segments, (btstack_linked_item_t *) network_pdu);
-            bytes_current_segment = MESH_NETWORK_PAYLOAD_MAX;
-        }
-        uint16_t bytes_to_copy = btstack_min(bytes_current_segment, data_len);
-        (void) memcpy(&network_pdu->data[network_pdu->len], data, bytes_to_copy);
-        bytes_current_segment -= bytes_to_copy;
-        network_pdu->len      += bytes_to_copy;
-        data                  += bytes_to_copy;
-        data_len              -= bytes_to_copy;
-    }
+
+    bool ok = mesh_upper_transport_message_add_data(pdu, data, data_len);
+    if (!ok) return false;
 
     // upgrade to segmented if needed
     if (pdu->pdu_header.pdu_type == MESH_PDU_TYPE_UPPER_UNSEGMENTED_ACCESS) {
@@ -650,14 +633,9 @@ bool mesh_access_message_add_data(mesh_upper_transport_pdu_t * pdu, const uint8_
 }
 
 mesh_upper_transport_pdu_t * mesh_access_message_init(uint32_t opcode) {
-
-    mesh_upper_transport_pdu_t * pdu = btstack_memory_mesh_upper_transport_pdu_get();
+    mesh_upper_transport_pdu_t * pdu = mesh_upper_transport_message_init(MESH_PDU_TYPE_UPPER_UNSEGMENTED_ACCESS);
     if (!pdu) return NULL;
 
-    pdu->pdu_header.pdu_type = MESH_PDU_TYPE_UNSEGMENTED;
-    pdu->transmic_len = 4;
-    pdu->ack_opcode = MESH_ACCESS_OPCODE_NOT_SET;
-
     // add opcode
     uint8_t opcode_buffer[3];
     uint8_t opcode_len = mesh_access_setup_opcode(opcode_buffer, opcode);
diff --git a/src/mesh/mesh_upper_transport.c b/src/mesh/mesh_upper_transport.c
index 37dba4183..7adcfc4ce 100644
--- a/src/mesh/mesh_upper_transport.c
+++ b/src/mesh/mesh_upper_transport.c
@@ -35,6 +35,14 @@
  *
  */
 
+#include <stdarg.h>
+#include "btstack_tlv.h"
+#include "mesh/mesh_foundation.h"
+#include "mesh_upper_transport.h"
+#include "mesh/mesh.h"
+#include "mesh/mesh_proxy.h"
+#include "mesh/mesh_node.h"
+
 #define BTSTACK_FILE__ "mesh_upper_transport.c"
 
 #include "mesh/mesh_upper_transport.h"
@@ -1221,3 +1229,61 @@ void mesh_upper_transport_register_control_message_handler(void (*callback)(mesh
 void mesh_upper_transport_init(){
     mesh_lower_transport_set_higher_layer_handler(&mesh_upper_transport_pdu_handler);
 }
+
+
+mesh_upper_transport_pdu_t * mesh_upper_transport_message_init(mesh_pdu_type_t pdu_type) {
+    mesh_upper_transport_pdu_t * pdu = btstack_memory_mesh_upper_transport_pdu_get();
+    if (!pdu) return NULL;
+
+    pdu->pdu_header.pdu_type = pdu_type;
+    pdu->transmic_len = 4;
+    pdu->ack_opcode = MESH_ACCESS_OPCODE_NOT_SET;
+
+    return pdu;
+}
+
+
+bool mesh_upper_transport_message_add_data(mesh_upper_transport_pdu_t * pdu, const uint8_t * data, uint16_t data_len){
+    uint16_t bytes_current_segment = 0;
+    mesh_network_pdu_t * network_pdu = (mesh_network_pdu_t *) btstack_linked_list_get_last_item(&pdu->segments);
+    if (network_pdu){
+        bytes_current_segment = MESH_NETWORK_PAYLOAD_MAX - network_pdu->len;
+    }
+    while (data_len > 0){
+        if (bytes_current_segment == 0){
+            network_pdu = (mesh_network_pdu_t *) mesh_network_pdu_get();
+            if (network_pdu == NULL) return false;
+            btstack_linked_list_add_tail(&pdu->segments, (btstack_linked_item_t *) network_pdu);
+            bytes_current_segment = MESH_NETWORK_PAYLOAD_MAX;
+        }
+        uint16_t bytes_to_copy = btstack_min(bytes_current_segment, data_len);
+        (void) memcpy(&network_pdu->data[network_pdu->len], data, bytes_to_copy);
+        bytes_current_segment -= bytes_to_copy;
+        network_pdu->len      += bytes_to_copy;
+        data                  += bytes_to_copy;
+        data_len              -= bytes_to_copy;
+    }
+    return true;
+}
+
+bool mesh_upper_transport_message_add_uint8(mesh_upper_transport_pdu_t * pdu, uint8_t value){
+    return mesh_upper_transport_message_add_data(pdu, &value, 1);
+}
+
+bool mesh_upper_transport_message_add_uint16(mesh_upper_transport_pdu_t * pdu, uint16_t value){
+    uint8_t buffer[2];
+    little_endian_store_16(buffer, 0, value);
+    return mesh_upper_transport_message_add_data(pdu, buffer, sizeof(buffer));
+}
+
+bool mesh_upper_transport_message_add_uint24(mesh_upper_transport_pdu_t * pdu, uint16_t value){
+    uint8_t buffer[3];
+    little_endian_store_24(buffer, 0, value);
+    return mesh_upper_transport_message_add_data(pdu, buffer, sizeof(buffer));
+}
+
+bool mesh_upper_transport_message_add_uint32(mesh_upper_transport_pdu_t * pdu, uint16_t value){
+    uint8_t buffer[4];
+    little_endian_store_32(buffer, 0, value);
+    return mesh_upper_transport_message_add_data(pdu, buffer, sizeof(buffer));
+}