Vyacheslav V 1 день назад
Родитель
Сommit
5e98aeb467

+ 31 - 26
pico-tcp-service/pico-tcp/src/pico_server_dispatcher.cpp

@@ -391,41 +391,47 @@ int pico_server_dispatcher::pico_measurement()
     return sendValidatedMsgpackData();
 }
 
+std::vector<std::vector<int16_t>> pico_server_dispatcher::split_packets(int i, int j)
+{
+    std::vector<std::vector<int16_t>> packets = {};
+
+    std::vector<int16_t> data_vec = std::vector<int16_t>(data_buffer_vec[i][j], data_buffer_vec[i][j] + points_vector[i]);
+
+    for(auto it = data_vec.begin(); it < data_vec.end(); it += MAX_PACKET)
+    {
+        if(it + MAX_PACKET < data_vec.end())
+        {
+            packets.push_back(std::vector<int16_t>(it, it + MAX_PACKET));
+        }
+        else
+        {
+            packets.push_back(std::vector<int16_t>(it, data_vec.end()));
+        }
+    }
+
+    return packets;
+}
+
 int pico_server_dispatcher::pico_send_points()
 {
-    for(int i = 0; i < measurement_times; ++i)
+    for(uint32_t i = 0; i < measurement_times; ++i)
     {
         for(uint32_t j = 0; j < number_channels; ++j)
         {
-            uint32_t data_seek = 0;
-            uint32_t packet = 0;
+            std::vector<std::vector<int16_t>> packets = split_packets(i, j);
+            uint32_t num_packet = 1;
             uint32_t total_data = sizeof(int16_t) * points_vector[i];
             uint32_t total_packets = 1 + ((uint32_t) ((total_data * 1.0f) / MAX_PACKET));
-            do
-            {
-                uint32_t ndata_sent;
-                if(total_data - data_seek < MAX_PACKET - 22)
-                {
-                    ndata_sent = total_data - data_seek;
-                }
-                else
-                {
-                    ndata_sent = MAX_PACKET - 22;
-                }
 
+            for(std::vector<int16_t> packet : packets)
+            {
                 pk_ptr->pack(magic_number);
                 pk_ptr->pack(0xCD);
                 pk_ptr->pack(i);
                 pk_ptr->pack(j);
-                pk_ptr->pack(total_packets);
+                pk_ptr->pack(num_packet);
+                pk_ptr->pack(packets.size());
                 pk_ptr->pack(packet);
-                pk_ptr->pack(ndata_sent);
-                //pk_ptr->pack(*(data_buffer_vec[i][j] + (data_seek / 2)));
-                
-                //int16_t test_data = data_buffer_vec[i][j][0];
-
-                //logger << LogPref::Flag(INFO) << "Total data: " << total_data << ". Data seek: " << data_seek << ". Test data:" << test_data << endl;
-                //logger << LogPref::Flag(INFO) << "Sending packet " << packet << " of " << total_packets << " (sig" << i << "ch" << j << "). Data to send: " << ndata_sent << endl;
 
                 int ret = sendValidatedMsgpackData();
                 if(ret != 1)
@@ -434,9 +440,6 @@ int pico_server_dispatcher::pico_send_points()
                     return -1;
                 }
 
-                data_seek += ndata_sent;
-                ++packet;
-
                 ret = recvValidatedHeader();
                 if(ret != 1)
                 {
@@ -452,7 +455,9 @@ int pico_server_dispatcher::pico_send_points()
                     sendErrorMsg(0x80000002, "Invalid confirm code!");
                     return -1;
                 }
-            } while (packet < total_packets);
+
+                num_packet++;
+            }
         }
     }
 

+ 1 - 0
pico-tcp-service/pico-tcp/src/pico_server_dispatcher.hpp

@@ -41,6 +41,7 @@ class pico_server_dispatcher : public basic_proto_dispatcher {
         int pico_measurement();
         int pico_status();
 
+        std::vector<std::vector<int16_t>> split_packets(int i, int j);
         int pico_send_points();
 
     public: