From 74c96c72625aff6613d69c7168e1a7d76da22870 Mon Sep 17 00:00:00 2001
From: wu_xinjun <bent20140204@outlook.com>
Date: 星期五, 24 六月 2022 17:18:31 +0800
Subject: [PATCH] add taskuuid

---
 env/requirements/ipywidgets-7.7.1-py2.py3-none-any.whl         |    0 
 src/microwave/servers.py                                       |    3 
 src/engine/MessageThreads.py                                   |  147 +++++++-----
 env/requirements/widgetsnbextension-3.6.1-py2.py3-none-any.whl |    0 
 src/utils/tools.py                                             |   23 +
 src/engine/AcquisitionMain.py                                  |   78 +++++
 README.md                                                      |   28 ++
 /dev/null                                                      |    0 
 src/protos/aerial.proto                                        |  230 +++++++++++--------
 env/requirements/open3d-0.14.1-cp39-cp39-win_amd64.whl         |    0 
 requirements.txt                                               |   20 
 src/Server.py                                                  |   71 +++++
 env/requirements/jupyterlab_widgets-1.1.1-py3-none-any.whl     |    0 
 env/requirements/numpy-1.23.0-cp39-cp39-win_amd64.whl          |    0 
 src/engine/devices.py                                          |   63 ++++-
 15 files changed, 466 insertions(+), 197 deletions(-)

diff --git a/README.md b/README.md
index b12bded..78d850f 100644
--- a/README.md
+++ b/README.md
@@ -5,4 +5,30 @@
 1. 鏍规嵁proto鏁版嵁缁撴瀯锛岄噸鏂颁紭鍖杝rc\engine\MessageThreads.py鐨勭浉鍏冲唴瀹癸紱
 2. 閲囬泦绔細淇敼src\engine\devices.py鍐呯殑鐩告満鐨勬暟鎹噰闆嗙嚎绋嬶紱
 3. 鏈嶅姟绔細澧炲姞鍥惧儚鏁版嵁鐨勬秷鎭В鏋愶紱
-4. src\engine\MessageThreads.py鍐呮坊鍔犳暟鎹彂閫佸拰鎺ユ敹绾跨▼銆�
\ No newline at end of file
+4. src\engine\MessageThreads.py鍐呮坊鍔犳暟鎹彂閫佸拰鎺ユ敹绾跨▼銆�
+
+
+## MQ keys
+
+馃巿Given that the name parameters of one couple of the server and client is set to as below shown:  
+馃毄server name : `server0`  
+馃毄client name : `bunker0.block0.device0`  
+
+
+1. Server:  
+    > Binding keys for receive messages from clients are shown below:  
+    >> `server0.logs.test0`  
+    >> `server0.images.test0`  
+    >> `server0.plys.test0`  
+
+    > Routing keys for send commands to the client are shown below:  
+    >> `bunker0.block0.device0`  
+
+2. Client:  
+    > Binding keys for receive commands from the server are shown below: 
+    >> `bunker0.block0.device0`  
+
+    > Routing keys for send messages to the server are shown below:  
+    >> `server0.logs.test0`  
+    >> `server0.images.test0`  
+    >> `server0.plys.test0` 
\ No newline at end of file
diff --git a/env/requirements/ipywidgets-7.7.0-py2.py3-none-any.whl b/env/requirements/ipywidgets-7.7.1-py2.py3-none-any.whl
similarity index 84%
rename from env/requirements/ipywidgets-7.7.0-py2.py3-none-any.whl
rename to env/requirements/ipywidgets-7.7.1-py2.py3-none-any.whl
index 171191d..7c305c0 100644
--- a/env/requirements/ipywidgets-7.7.0-py2.py3-none-any.whl
+++ b/env/requirements/ipywidgets-7.7.1-py2.py3-none-any.whl
Binary files differ
diff --git a/env/requirements/jupyterlab_widgets-1.1.0-py3-none-any.whl b/env/requirements/jupyterlab_widgets-1.1.0-py3-none-any.whl
deleted file mode 100644
index c4c53f7..0000000
--- a/env/requirements/jupyterlab_widgets-1.1.0-py3-none-any.whl
+++ /dev/null
Binary files differ
diff --git a/env/requirements/jupyterlab_widgets-1.1.1-py3-none-any.whl b/env/requirements/jupyterlab_widgets-1.1.1-py3-none-any.whl
new file mode 100644
index 0000000..991a544
--- /dev/null
+++ b/env/requirements/jupyterlab_widgets-1.1.1-py3-none-any.whl
Binary files differ
diff --git a/env/requirements/numpy-1.22.4-cp39-cp39-win_amd64.whl b/env/requirements/numpy-1.22.4-cp39-cp39-win_amd64.whl
deleted file mode 100644
index a5e59ff..0000000
--- a/env/requirements/numpy-1.22.4-cp39-cp39-win_amd64.whl
+++ /dev/null
Binary files differ
diff --git a/env/requirements/numpy-1.23.0-cp39-cp39-win_amd64.whl b/env/requirements/numpy-1.23.0-cp39-cp39-win_amd64.whl
new file mode 100644
index 0000000..6126135
--- /dev/null
+++ b/env/requirements/numpy-1.23.0-cp39-cp39-win_amd64.whl
Binary files differ
diff --git a/env/requirements/open3d-0.14.1-cp39-cp39-win_amd64.whl b/env/requirements/open3d-0.14.1-cp39-cp39-win_amd64.whl
new file mode 100644
index 0000000..ba26c00
--- /dev/null
+++ b/env/requirements/open3d-0.14.1-cp39-cp39-win_amd64.whl
Binary files differ
diff --git a/env/requirements/widgetsnbextension-3.6.0-py2.py3-none-any.whl b/env/requirements/widgetsnbextension-3.6.0-py2.py3-none-any.whl
deleted file mode 100644
index 4ad756f..0000000
--- a/env/requirements/widgetsnbextension-3.6.0-py2.py3-none-any.whl
+++ /dev/null
Binary files differ
diff --git a/env/requirements/widgetsnbextension-3.6.1-py2.py3-none-any.whl b/env/requirements/widgetsnbextension-3.6.1-py2.py3-none-any.whl
new file mode 100644
index 0000000..9ea5712
--- /dev/null
+++ b/env/requirements/widgetsnbextension-3.6.1-py2.py3-none-any.whl
Binary files differ
diff --git a/requirements.txt b/requirements.txt
index 5f59e49..cdae0d6 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,10 +1,10 @@
-numpy
-Flask
-pika
-protobuf
-tqdm
-opencv-python
-pyserial
-bitarray
-open3d
-protoc-wheel-0
\ No newline at end of file
+numpy==1.23.0
+Flask==2.1.2
+pika==1.2.1
+protobuf==4.21.1
+tqdm==4.64.0
+opencv-python==4.6.0.66
+pyserial==3.5
+bitarray==2.5.1
+protoc-wheel-0==21.1
+open3d==0.14.1
\ No newline at end of file
diff --git a/src/Server.py b/src/Server.py
index 9194321..5818ae8 100644
--- a/src/Server.py
+++ b/src/Server.py
@@ -1,10 +1,9 @@
 import sys              # NOQA: E402    
 import os
-from flask import Flask
+from flask import Flask, request
 import pika
 import uuid
 import queue
-from werkzeug.wrappers import request
 from threading import Thread
 from datetime import datetime
 
@@ -13,6 +12,7 @@
 from .engine.DeviceManager import DeviceManager
 from .engine import MessageThreads as ths
 from .protos import aerial_pb2 as pb
+from .utils.tools import update_folder_for_today
 
 
 
@@ -35,9 +35,22 @@
         self.WEBport = WEBport
         self.save_folder = save_folder
         self.server_name = server_name
-        
 
-        # self.route('/api', methods=['POST'])(self.api)
+        today = datetime.now().strftime('%Y-%m-%d')
+        today_folder = os.path.join(self.save_folder,today)
+
+        self.today = {"today":today,
+                    "today_folder":today_folder,
+                    "sup_folder":self.save_folder,
+                    "sub_folder": ""}
+
+        self.task_uuid_folder = {"init":os.path.join(self.today["today_folder"],"init")}
+
+        if not os.path.exists(self.task_uuid_folder["init"]):
+            os.makedirs(self.task_uuid_folder["init"])
+
+
+        self.route('/api', methods=['POST'])(self.api)
         self.route('/', methods=['GET'])(self.hello)
         # self._def_routes()
 
@@ -51,7 +64,7 @@
     def _connect_to_MQ(self):
         credentials = pika.PlainCredentials(self.MQuser, self.MQpassword)
         self.parameters = pika.ConnectionParameters(
-            credentials=credentials, host=self.MQhost)
+            credentials=credentials, host=self.MQhost,heartbeat=0)
         # 杩炴帴闃熷垪鏈嶅姟鍣�
         try:
             self.connection = pika.BlockingConnection(self.parameters)
@@ -110,7 +123,7 @@
         self.MsgDecoder_Thread = ths.decodeThread(
                                     queue_list= queue_list,
                                     queue_tags= queue_tags,
-                                    save_path= self.save_folder           
+                                    task_folder= self.task_uuid_folder        
                                     )
 
         self.MsgDecoder_Thread.setDaemon(True)
@@ -135,6 +148,52 @@
     def hello(self):
         return 'Hello, This is acquisition demo API!'
 
+    def api(self):
+
+        try:
+            success, response_bytes = self.verify_commands(request.data)
+        except:
+            response_bytes = b'command error!'
+
+        response = Flask.response_class(
+            response_bytes,
+            mimetype='application/x-bytes'
+        )
+        return response,200
+
+
+    def verify_commands(self,input_command:bytes):
+
+        # parse the command from bytes to the pb object
+        req_command = pb.CommandMessage()
+        req_command.ParseFromString(input_command)
+
+        # extracting some info for use
+        source = req_command.source
+        # generatetime = req_command.generatetime
+        # syscommand = req_command.syscommand
+        # subcommand = req_command.subcommand
+        targetclient = req_command.targetclient
+        # returnserver = req_command.returnserver
+        taskuuid = req_command.taskuuid
+
+        update_folder_for_today(self.today)
+        task_path = os.path.join(self.today["today_folder"],taskuuid)
+
+        self.task_uuid_folder[taskuuid] = task_path
+
+        if not os.path.exists(task_path):
+            os.makedirs(task_path)
+
+        curr_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
+        print(f"[x] {curr_time}|(From {source}): task [{taskuuid}] received and sending it to [{targetclient}]." )
+
+        self.CommandsSender_queue.put([targetclient,input_command])
+        response_bytes = bytes(f"Receive command success! The data will be save in [{os.path.abspath(task_path)}]",\
+                        encoding="utf8")
+
+        return True, response_bytes
+
     def run_rabbitmq(self):
         self._connect_to_MQ()
         self._receiver_Thread_Launcher()
diff --git a/src/engine/AcquisitionMain.py b/src/engine/AcquisitionMain.py
index e2a580c..af152a0 100644
--- a/src/engine/AcquisitionMain.py
+++ b/src/engine/AcquisitionMain.py
@@ -1,7 +1,9 @@
 import sys              # NOQA: E402
 import os
+from time import sleep
 import pika
 import queue
+from datetime import datetime
 
 # from .CaptureThread import CaptureThread
 # from .ControllThread import ControllThread
@@ -14,7 +16,7 @@
 # src_path = os.path.abspath(src_path)
 # sys.path.insert(0, src_path)
 
-# from ..protos import aerial_pb2 as pb
+from ..protos import aerial_pb2 as pb
 
 
 IMAGE_WIDTH = 3840
@@ -116,7 +118,7 @@
     def _connect_to_MQ(self):
         credentials = pika.PlainCredentials(self.MQuser, self.MQpassword)
         self.parameters = pika.ConnectionParameters(
-            credentials=credentials, host=self.MQhost)
+            credentials=credentials, host=self.MQhost,heartbeat=0)
         # 杩炴帴闃熷垪鏈嶅姟鍣�
         try:
             self.connection = pika.BlockingConnection(self.parameters)
@@ -133,7 +135,7 @@
                                     MQparams=self.parameters,
                                     exchange_name='commands_topic',
                                     exchange_type='topic',
-                                    MQqueue_name="server0_commands_queue",
+                                    MQqueue_name=f"{self.device_id}_commands_queue",
                                     binding_keys=[f"{self.device_id}"],
                                     message_queue=self.CommandsReceiver_queue
                                     )
@@ -206,19 +208,80 @@
                     timeout=self.timeout,
                     logs_queue=self.LogsSender_queue,
                     device_id=self.device_id,
-                    routing_key="server0"
+                    init_binding_key=self.device_id,
+                    init_routing_key="server0"
                     )
 
         self.mc = microwaveController(
                     MicrowaveHost=self.MICROWAVEhost,
                     MicrowavePort=self.MICROWAVEport,
                     init_packet_threshold=100,
-                    init_timeusage_threshold=3,
+                    init_timeusage_threshold=0.2,
                     device_id=self.device_id,
                     logs_queue=self.LogsSender_queue,
                     plys_queue=self.PlysSender_queue,
-                    routing_key="server0"            
+                    init_binding_key=self.device_id,
+                    init_routing_key="server0"         
         )
+
+    def command_control(self):
+        while True:
+
+            try:
+                while not self.CommandsReceiver_queue.empty():
+                    command_bytes= self.CommandsReceiver_queue.get()
+
+                    # parse the command from bytes to the pb object
+                    req_command = pb.CommandMessage()
+                    req_command.ParseFromString(command_bytes)
+
+                    # extracting some info for use
+                    source = req_command.source
+                    generatetime = req_command.generatetime
+                    syscommand = req_command.syscommand
+                    subcommand = req_command.subcommand
+                    targetclient = req_command.targetclient
+                    returnserver = req_command.returnserver
+                    taskuuid = req_command.taskuuid
+
+                    curr_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
+                    print(f"[x] {curr_time}|(From {source}): task [{taskuuid}] received!" )
+
+                    # command for camera
+                    if syscommand == pb.SysCommand.CAMERA_COMMAND:
+                        # capture image
+                        if subcommand == pb.SubCommand.ONE_TIME_CAPTURE:
+                            self.cc.capture(routing_key=returnserver,taskuuid=taskuuid)
+                        # unknown command
+                        else:
+                            pass
+
+                    # command for microwave device
+                    elif syscommand == pb.SysCommand.MICROWAVE_COMMAND:
+                        if subcommand == pb.SubCommand.ONE_CIRCLE_SCAN:
+                            self.mc.scan(routing_key=returnserver,taskuuid=taskuuid)
+                        # unknown command
+                        else:
+                            pass
+
+                    # command for dust cleaner
+                    elif syscommand == pb.Syscommand.DUSTCLEANER_COMMAND:
+                        if subcommand == pb.SubCommand.ONE_CLEAN_SCAN:
+                            self.dc.clean(routing_key=returnserver,taskuuid=taskuuid)
+                        # unknown command
+                        else:
+                            pass
+                    # unknown command
+                    else:
+                        pass
+
+                else:
+                    sleep(1)
+
+            except:
+
+                break
+
         
 
     def run_rabbitmq(self):
@@ -236,6 +299,8 @@
         self.run_rabbitmq()
         # connecting to devices and wrap data to the corressponding queue
         self.run_device()
+        sleep(10)
+        self.command_control()
 
     def stop_all(self):
 
@@ -254,7 +319,6 @@
         #     self.stop_all()
         # print("main thread end.")
         self.run_all()
-        self.CommandsReceiver_Thread.join()
         return 0
  
             
diff --git a/src/engine/MessageThreads.py b/src/engine/MessageThreads.py
index 998a3e2..8cc2344 100644
--- a/src/engine/MessageThreads.py
+++ b/src/engine/MessageThreads.py
@@ -67,20 +67,20 @@
                         message = self.message_queue.get()
                         msg_routing_key = message[0]
                         msg_body = message[1]
+                        if msg_body is not False:
+                            # publish a PERSISTENT message
+                            channel.basic_publish(
+                            exchange = self.exchange_name,
+                            routing_key = msg_routing_key,
+                            body = msg_body,
+                            properties=pika.BasicProperties(
+                                delivery_mode=pika.spec.PERSISTENT_DELIVERY_MODE
+                                    )
+                            )
 
-                        # publish a PERSISTENT message
-                        channel.basic_publish(
-                        exchange = self.exchange_name,
-                        routing_key = msg_routing_key,
-                        body = msg_body,
-                        properties=pika.BasicProperties(
-                            delivery_mode=pika.spec.PERSISTENT_DELIVERY_MODE
-                                )
-                        )
-
-                        timestamp = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
-                        caption = f"[x] {timestamp} | Sending message to [{msg_routing_key}]"
-                        print(caption)
+                            timestamp = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
+                            caption = f"[x] {timestamp} | Sending message to [{msg_routing_key}]"
+                            print(caption)
 
                     else:
                         time.sleep(1)
@@ -143,20 +143,21 @@
 
         if self.is_stop:
             ch.close()
-        self.message_queue.put(body)
+        if body is not False:
+            self.message_queue.put(body)
         ch.basic_ack(delivery_tag = method.delivery_tag)
 
 class decodeThread(threading.Thread):
     def __init__(self,
         queue_list:List[queue.Queue],
         queue_tags:List[str],
-        save_path:str):
+        task_folder:dict[str,str]):
         super().__init__()
 
         self.queue_list = queue_list
         self.queue_tags = queue_tags
         self.queue_num = 0
-        self.save_path = save_path
+        self.task_folder = task_folder
         self.is_stop = False
 
         assert len(self.queue_list) == len(self.queue_tags)
@@ -167,22 +168,22 @@
 
     def run(self) -> None:
 
-        # creating a path for saving data
-        time_tag = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
-        self.save_root_folder = os.path.join(self.save_path,time_tag)
-        os.makedirs(self.save_root_folder)
+        # # creating a path for saving data
+        # time_tag = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
+        # self.save_root_folder = os.path.join(self.task_folder,time_tag)
+        # os.makedirs(self.save_root_folder)
 
-        self.logsmsg_folder = os.path.join(self.save_root_folder,"LogsMsg")
-        self.imagesmsg_folder = os.path.join(self.save_root_folder,"ImagesMsg")
-        self.plysmsg_folder = os.path.join(self.save_root_folder,"PlysMsg")
-        self.commandsmsg_folder = os.path.join(self.save_root_folder,"CommandsMsg")
+        # self.logsmsg_folder = os.path.join(self.save_root_folder,"LogsMsg")
+        # self.imagesmsg_folder = os.path.join(self.save_root_folder,"ImagesMsg")
+        # self.plysmsg_folder = os.path.join(self.save_root_folder,"PlysMsg")
+        # self.commandsmsg_folder = os.path.join(self.save_root_folder,"CommandsMsg")
 
-        sub_folder_list = [self.logsmsg_folder,self.imagesmsg_folder,
-                        self.plysmsg_folder,self.commandsmsg_folder]
+        # sub_folder_list = [self.logsmsg_folder,self.imagesmsg_folder,
+        #                 self.plysmsg_folder,self.commandsmsg_folder]
 
-        for folder in sub_folder_list:
-            os.mkdir(folder)
-            print(f"[NOTICE] Creating folder: {folder}")
+        # for folder in sub_folder_list:
+        #     os.mkdir(folder)
+        #     print(f"[NOTICE] Creating folder: {folder}")
 
         # process the queue list
         self.queue_num = len(self.queue_list)
@@ -221,16 +222,19 @@
             msg_pb = pb.LogsMessage()
             msg_pb.ParseFromString(msg)
 
-            # save the raw pb msg 
-            curr_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
-            raw_file_name = os.path.join(self.logsmsg_folder,f"{curr_time}.LogsMsg")
-            with open(raw_file_name, 'wb') as file:
-                file.write(msg)
-
             # process the msg
             msg_source = msg_pb.source
             msg_timestamp = msg_pb.timestamp
             msg_context = msg_pb.context
+            taskuuid = msg_pb.taskuuid
+
+            save_folder = self.task_folder[taskuuid]
+
+            # save the raw pb msg 
+            # curr_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
+            raw_file_name = os.path.join(save_folder,f"{msg_timestamp}-{msg_source}.LogsMsg")
+            with open(raw_file_name, 'wb') as file:
+                file.write(msg)
 
             # display the info to the console
             curr_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
@@ -248,15 +252,18 @@
             msg_pb = pb.ImagesMessage()
             msg_pb.ParseFromString(msg)
 
-            # save the raw pb msg
-            curr_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
-            raw_file_name = os.path.join(self.imagesmsg_folder,f"{curr_time}.ImagesMsg")
-            with open(raw_file_name, 'wb') as file:
-                file.write(msg)
-
             # process the msg
             msg_source = msg_pb.source
             msg_timestamp = msg_pb.timestamp
+            taskuuid = msg_pb.taskuuid
+            save_folder = self.task_folder[taskuuid]
+
+            # save the raw pb msg
+            # curr_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
+            raw_file_name = os.path.join(save_folder,f"{msg_timestamp}-{msg_source}.ImagesMsg")
+            with open(raw_file_name, 'wb') as file:
+                file.write(msg)
+
 
             # process the images
             id = 0
@@ -268,8 +275,8 @@
                 if (image_byte is None) | (len(image_byte) != imagelegth ):
                     pass
                 else:
-                    filename = f"{msg_source}_{msg_timestamp}_image{id}.jpg"
-                    filepath = os.path.join(self.imagesmsg_folder,filename)
+                    filename = f"{msg_timestamp}-{msg_source}-image{id}.jpg"
+                    filepath = os.path.join(save_folder,filename)
                     with open(filepath, 'wb') as f:
                         f.write(image_byte)
 
@@ -289,15 +296,18 @@
             msg_pb = pb.PlysMessage()
             msg_pb.ParseFromString(msg)
 
-            # save the raw pb msg 
-            curr_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
-            raw_file_name = os.path.join(self.plysmsg_folder,f"{curr_time}.PlysMsg")
-            with open(raw_file_name, 'wb') as file:
-                file.write(msg)
-
             # process the msg
             msg_source = msg_pb.source
             msg_timestamp = msg_pb.timestamp
+            taskuuid = msg_pb.taskuuid
+
+            save_folder = self.task_folder[taskuuid]
+
+            # save the raw pb msg 
+            # curr_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
+            raw_file_name = os.path.join(save_folder,f"{msg_timestamp}-{msg_source}.PlysMsg")
+            with open(raw_file_name, 'wb') as file:
+                file.write(msg)
             
             # process the muti ply data
             id = 0
@@ -317,13 +327,14 @@
                     data_array = np.frombuffer(data_byte,dtype=dt)
                     data_array = data_array.reshape(rows,cols,order=order)
                     # save the data with .ply format
-                    filename = f"{msg_source}_{msg_timestamp}_pointcloud{id}"
-                    write_ply(data_array,self.plysmsg_folder,filename)
+                    filename = f"{msg_timestamp}-{msg_source}-pointcloud{id}"
+                    write_ply(data_array,save_folder,filename)
 
                 # next ply item
                 id += 1
 
     def decode_CommandsMsg(self,queue):
+        
 
         raise NotImplementedError("NOT IMPLEMENT!")
 
@@ -332,15 +343,18 @@
 def send_logs_tool(logs:List[str],
                 logs_queue:queue.Queue,
                 source:str,
-                routing_key:str):
+                routing_key:str,
+                taskuuid:str = "init"):
 
     for i, log in enumerate(logs):
         if log is not None:
             # constract a logs message
             logsMsg = pb.LogsMessage()
             logsMsg.source = source
-            logsMsg.timestamp = f"{time.asctime()}"
+            curr_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
+            logsMsg.timestamp = curr_time
             logsMsg.context = log
+            logsMsg.taskuuid = taskuuid
             # convert the proto object to string
             logsMsg_bytes = logsMsg.SerializeToString()
             # add logsmsg to queue
@@ -350,13 +364,15 @@
 def send_images_tool(images:List[np.array],
                     images_queue:queue.Queue,
                     source:str,
-                    routing_key:str):
+                    routing_key:str,
+                    taskuuid:str = "init"):
 
     # constract a images message
     imagesMsg = pb.ImagesMessage()
     imagesMsg.source = source
     curr_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
     imagesMsg.timestamp = curr_time
+    imagesMsg.taskuuid = taskuuid
 
     for img in images:
         if img is not None:
@@ -377,13 +393,17 @@
 def send_pointcloud_tool(pointclouds:queue.Queue,
                         plys_queue:queue.Queue,
                         source:str,
-                        routing_key:str):
+                        routing_key:str,
+                        taskuuid:str = "init"):
 
     # constract a plys message
     plysMsg = pb.PlysMessage()
     plysMsg.source = source
     curr_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
     plysMsg.timestamp = curr_time
+    plysMsg.taskuuid = taskuuid
+
+    empty = True
 
 
     run =True
@@ -393,6 +413,7 @@
             value = pointclouds.get()
 
             if value is not False:
+                empty = False
                 pointcloud = np.array(value)
                 # get the attributes of the PointCloudItem
                 rows = pointcloud.shape[0]
@@ -412,13 +433,19 @@
                 item.data = data
 
             else:
-                # converting the pb ply msg to bytes
-                plysMsg_bytes = plysMsg.SerializeToString()
-                # add the plysMsg to the queue
-                plys_queue.put([routing_key,plysMsg_bytes])
 
-                # end the outer while loop and triminate this function
+                if not empty:
+                    # converting the pb ply msg to bytes
+                    plysMsg_bytes = plysMsg.SerializeToString()
+                    # add the plysMsg to the queue
+                    plys_queue.put([routing_key,plysMsg_bytes])
+                    # end the outer while loop and triminate this function
+
+                else:
+                    print("[x] NO poindcloud has been captured!")
                 run = False
+        else:
+            time.sleep(3)
 
     
 
diff --git a/src/engine/devices.py b/src/engine/devices.py
index 837cc3c..e4c72a9 100644
--- a/src/engine/devices.py
+++ b/src/engine/devices.py
@@ -24,7 +24,8 @@
             logs_queue:queue.Queue,
             images_queue:queue.Queue,
             init_routing_key:str,
-            init_binding_key:str
+            init_binding_key:str,
+            init_taskuuid:str = "init"
             ):
 
         self.IMAGE_WIDTH = IMAGE_WIDTH
@@ -36,6 +37,8 @@
         self.routing_key = init_routing_key
         self.init_routing_key = init_routing_key
         self.binding_key = init_binding_key
+        self.init_taskuuid = init_taskuuid
+        self.taskuuid = init_taskuuid
         self._check_cameras()
 
 
@@ -68,12 +71,14 @@
         send_logs_tool(logs=logs,
                         logs_queue=self.logs_queue,
                         source=self.device_id,
-                        routing_key=self.routing_key+".logs.test0")
+                        routing_key=self.routing_key+".logs.test0",
+                        taskuuid=self.taskuuid)
 
         send_images_tool(images=images,
                         images_queue=self.images_queue,
                         source=self.device_id,
-                        routing_key=self.routing_key+".images.test0")
+                        routing_key=self.routing_key+".images.test0",
+                        taskuuid=self.taskuuid)
 
 
     def _capture_image(self,mode:str = "capture"):
@@ -118,7 +123,7 @@
             if TEST:
                 self.working_ports.append(dev_port)
                 if is_reading:
-                    self.camera_work[dev_port] == True
+                    self.camera_work[dev_port] = True
 
             
             log_list.append(log)
@@ -127,14 +132,18 @@
         return log_list, image_list
 
 
-    def capture(self,routing_key:str):
+    def capture(self,routing_key:str, taskuuid:str):
 
         self.routing_key = routing_key
+        self.taskuuid = taskuuid
 
         (logs,images) = self._capture_image()
-        self._generate_msg = (logs,images)
+
+        # generate the msg and put it to queues
+        self._generate_msg(logs,images)
 
         self.routing_key = self.init_routing_key
+        self.taskuuid = self.init_taskuuid
 
 
 
@@ -144,16 +153,23 @@
             MicrowaveHost: str, 
             MicrowavePort: int, 
             init_packet_threshold: Union[int, None], 
-            init_timeusage_threshold: Union[int, None],
+            init_timeusage_threshold: Union[int, float, None],
             device_id:str,
             logs_queue:queue.Queue,
             plys_queue:queue.Queue,
-            routing_key:str,
+            init_routing_key:str,
+            init_binding_key:str,
+            init_taskuuid:str = "init"
             ):
         super().__init__(MicrowaveHost, MicrowavePort)
         self.device_id = device_id
         self.plys_queue = plys_queue
-        self.routing_key = routing_key
+
+        self.routing_key = init_routing_key
+        self.init_routing_key = init_routing_key
+        self.binding_key = init_binding_key
+        self.init_taskuuid = init_taskuuid
+        self.taskuuid = init_taskuuid
         # testing the device when instance the class
         self._get_pointcloud(init_packet_threshold,init_timeusage_threshold)
 
@@ -168,16 +184,34 @@
         send_pointcloud_tool(pointclouds=self.pointcloud_queue,
                             plys_queue=self.plys_queue,
                             source=self.device_id,
-                            routing_key=self.routing_key+".plys.test0")
+                            routing_key=self.routing_key+".plys.test0",
+                            taskuuid=self.taskuuid)
+
+
+    def scan(self,routing_key:str,taskuuid:str):
+
+        # self.routing_key = routing_key
+        # self.taskuuid = self.init_taskuuid
+
+        # self._generate_msg()
+
+        raise NotImplementedError
 
 ####################################### DUST CLEANER #########################################
 class dustCleanerController(DustCleaner):
-    def __init__(self, com, bps, timeout, logs_queue, device_id,routing_key):
+    def __init__(self, com, bps, timeout, logs_queue, device_id,
+                init_routing_key:str,
+                init_binding_key:str,
+                init_taskuuid:str = "init"):
         super().__init__(com, bps, timeout)
 
         self.logs_queue = logs_queue
         self.device_id = device_id
-        self.routing_key = routing_key
+        self.routing_key = init_routing_key
+        self.init_routing_key = init_routing_key
+        self.binding_key = init_binding_key
+        self.init_taskuuid = init_taskuuid
+        self.taskuuid = init_taskuuid
         self._check_cleaner()
 
 
@@ -198,3 +232,8 @@
                         logs_queue=self.logs_queue,
                         source = self.device_id,
                         routing_key=self.routing_key+".logs.test0")
+
+
+    def clean(self,routing_key:str,taskuuid:str):
+
+        raise NotImplementedError
diff --git a/src/microwave/servers.py b/src/microwave/servers.py
index c678379..47b15a4 100644
--- a/src/microwave/servers.py
+++ b/src/microwave/servers.py
@@ -258,7 +258,8 @@
         if self.udp_get_stop.isSet():
             print(f"{time.asctime()} | UDP-Get server is stopped by thresholds or keyborad interrupt.")
             self.udp_queue.put(False)
-            super().shutdown()
+            self._BaseServer__shutdown_request = True
+            # self.__is_shut_down.set()
 
 
 
diff --git a/src/protos/aerial.proto b/src/protos/aerial.proto
index c03a45b..d3ff8e6 100644
--- a/src/protos/aerial.proto
+++ b/src/protos/aerial.proto
@@ -1,125 +1,159 @@
 syntax = "proto3";
 
-enum SysCommand {
-  UNKOWN_COMMAND     = 0;   // 鏈煡鍛戒护
-  SYS_COMMAND        = 1;   // 绯荤粺鍛戒护
-  SENSOR_COMMAND     = 2;   // 浼犳劅鍣ㄥ懡浠�
-  FIVE_G_COMMAND     = 3;   // 閫氳5G妯″潡鍛戒护
-  CAMERA_COMMAND     = 4;   // 鎽勫儚澶村弬鏁板懡浠�
-  IO_COMMAND         = 5;   // 澶栬IO鍙f搷浣滃懡浠�
-  SYS_PARAMS_COMMAND = 6;   // 绯荤粺鍙傛暟鑾峰彇
-  WIFI_COMMAND       = 7;   // 璁惧WIFI鍙傛暟璁剧疆
-  KERNEL_COMMAND     = 8;   // 鏍稿績璁$畻鍙傛暟璁�
-  DEVICE_COMMAND     = 9;   // 宸ヤ綔璁惧鍙傛暟璁剧疆
-  MICRO_WAVE_COMMAND = 10;  // 姣背娉�
-}
+// enum SysCommand {
+//   UNKOWN_COMMAND     = 0;   // 鏈煡鍛戒护
+//   SYS_COMMAND        = 1;   // 绯荤粺鍛戒护
+//   SENSOR_COMMAND     = 2;   // 浼犳劅鍣ㄥ懡浠�
+//   FIVE_G_COMMAND     = 3;   // 閫氳5G妯″潡鍛戒护
+//   CAMERA_COMMAND     = 4;   // 鎽勫儚澶村弬鏁板懡浠�
+//   IO_COMMAND         = 5;   // 澶栬IO鍙f搷浣滃懡浠�
+//   SYS_PARAMS_COMMAND = 6;   // 绯荤粺鍙傛暟鑾峰彇
+//   WIFI_COMMAND       = 7;   // 璁惧WIFI鍙傛暟璁剧疆
+//   KERNEL_COMMAND     = 8;   // 鏍稿績璁$畻鍙傛暟璁�
+//   DEVICE_COMMAND     = 9;   // 宸ヤ綔璁惧鍙傛暟璁剧疆
+//   MICRO_WAVE_COMMAND = 10;  // 姣背娉�
+// }
 
-enum SubCommand {
-  option allow_alias = true;
+// enum SubCommand {
+//   option allow_alias = true;
    
-  UNKOWN_SUB_COMMAND   = 0;                   // 鏈煡瀛愬懡浠�
+//   UNKOWN_SUB_COMMAND   = 0;                   // 鏈煡瀛愬懡浠�
 
-  // 绯荤粺鍛戒护
-  POWER_ON_SUB_COMMAND = 1;                   // 寮�鏈�
-  POWER_OFF_SUB_COMMAND = 2;                  // 鍏虫満
+//   // 绯荤粺鍛戒护
+//   POWER_ON_SUB_COMMAND = 1;                   // 寮�鏈�
+//   POWER_OFF_SUB_COMMAND = 2;                  // 鍏虫満
 
-  // 浼犳劅鍣ㄥ懡浠�
-  SENSOR_INIT_SUB_COMMAND = 1;                // 浼犳劅鍣ㄥ垵濮嬪寲
-  SENSOR_REQURE_SUB_COMMAND = 2;              // 浼犳劅鍣ㄥ弬鏁拌幏鍙�
-  RTK_SETTING_SUB_COMMAND = 3;                // RTK澶栬鍙傛暟璁剧疆
-  RTK_REQURE_SUB_COMMAND = 4;                 // RTK澶栬鏁版嵁鑾峰彇
+//   // 浼犳劅鍣ㄥ懡浠�
+//   SENSOR_INIT_SUB_COMMAND = 1;                // 浼犳劅鍣ㄥ垵濮嬪寲
+//   SENSOR_REQURE_SUB_COMMAND = 2;              // 浼犳劅鍣ㄥ弬鏁拌幏鍙�
+//   RTK_SETTING_SUB_COMMAND = 3;                // RTK澶栬鍙傛暟璁剧疆
+//   RTK_REQURE_SUB_COMMAND = 4;                 // RTK澶栬鏁版嵁鑾峰彇
 
-  // 閫氳5G妯″潡鍛戒护
-  FIVE_G_INIT_SUB_COMMAND = 1;                // 5G妯″潡鍙傛暟鍒濆鍖�
-  FIVE_G_SEND_IMAGE_SUB_COMMAND = 2;          // 5G閫氳鍥惧儚鏁版嵁鍙戦��
-  FIVE_G_REQURE_SUB_COMMAND = 3;              // 5G閫氳鎺ユ敹
+//   // 閫氳5G妯″潡鍛戒护
+//   FIVE_G_INIT_SUB_COMMAND = 1;                // 5G妯″潡鍙傛暟鍒濆鍖�
+//   FIVE_G_SEND_IMAGE_SUB_COMMAND = 2;          // 5G閫氳鍥惧儚鏁版嵁鍙戦��
+//   FIVE_G_REQURE_SUB_COMMAND = 3;              // 5G閫氳鎺ユ敹
 
-  // 鎽勫儚澶村弬鏁板懡浠�
-  CAMERA_NUMBER_SUB_COMMAND = 1;              // 璁惧鎽勫儚澶翠釜鏁�  
-  CAMERA_RESOLUTION_SUB_COMMAND = 2;          // 璁惧鎽勫儚澶村伐浣滃垎杈ㄧ巼
-  CAMERA_FRAME_RATE_SUB_COMMAND = 3;          // 鎽勫儚澶村伐浣滃抚鐜�
-  CAMERA_OTHER_PARAMS_SUB_COMMAND = 4;        // 鎽勫儚澶村伐浣滃叾浠栧弬鏁�
+//   // 鎽勫儚澶村弬鏁板懡浠�
+//   CAMERA_NUMBER_SUB_COMMAND = 1;              // 璁惧鎽勫儚澶翠釜鏁�  
+//   CAMERA_RESOLUTION_SUB_COMMAND = 2;          // 璁惧鎽勫儚澶村伐浣滃垎杈ㄧ巼
+//   CAMERA_FRAME_RATE_SUB_COMMAND = 3;          // 鎽勫儚澶村伐浣滃抚鐜�
+//   CAMERA_OTHER_PARAMS_SUB_COMMAND = 4;        // 鎽勫儚澶村伐浣滃叾浠栧弬鏁�
 
-  // 澶栬IO鍙f搷浣滃懡浠�
-  CAMERA_DUST_REMOVAL_START_SUB_COMMAND = 1;  // 鎽勫儚澶撮櫎灏樺惎鍔�
-  CAMERA_CONTROL_START_SUB_COMMAND = 2;       // 澶栬鎺у埗鏁版嵁鍚姩锛�18璺帶鍒讹級
+//   // 澶栬IO鍙f搷浣滃懡浠�
+//   CAMERA_DUST_REMOVAL_START_SUB_COMMAND = 1;  // 鎽勫儚澶撮櫎灏樺惎鍔�
+//   CAMERA_CONTROL_START_SUB_COMMAND = 2;       // 澶栬鎺у埗鏁版嵁鍚姩锛�18璺帶鍒讹級
 
-  // 绯荤粺鍙傛暟鑾峰彇
-  CPU_FREQUENCY_SUB_COMMAND = 1;              // CPU涓婚宸ヤ綔鏁版嵁
-  CPU_KERNAL_TEMP_SUB_COMMAND = 2;            // CPU鏍稿績娓╁害鏁版嵁
-  CPU_BETTERY_DATA_SUB_COMMAND = 3;           // 鐢垫睜渚涚數鐢甸噺鏁版嵁
+//   // 绯荤粺鍙傛暟鑾峰彇
+//   CPU_FREQUENCY_SUB_COMMAND = 1;              // CPU涓婚宸ヤ綔鏁版嵁
+//   CPU_KERNAL_TEMP_SUB_COMMAND = 2;            // CPU鏍稿績娓╁害鏁版嵁
+//   CPU_BETTERY_DATA_SUB_COMMAND = 3;           // 鐢垫睜渚涚數鐢甸噺鏁版嵁
 
-  // 璁惧WIFI鍙傛暟璁剧疆
-  WIFI_HOTSPOT_SETTING_SUB_COMMAND = 1;       // WIFI鐑偣璁剧疆
-  WIFI_HOTSPOT_START_STOP_SUB_COMMAND = 2;    // WIFI鐑偣寮�鍚拰鍏抽棴
+//   // 璁惧WIFI鍙傛暟璁剧疆
+//   WIFI_HOTSPOT_SETTING_SUB_COMMAND = 1;       // WIFI鐑偣璁剧疆
+//   WIFI_HOTSPOT_START_STOP_SUB_COMMAND = 2;    // WIFI鐑偣寮�鍚拰鍏抽棴
 
-  // 鏍稿績璁$畻鍙傛暟璁剧疆
-  POINT_CLOUD_ACCURACY_SUB_COMMAND = 1;       // 鐐逛簯璁$畻绮惧害
-  SPLICING_PARAMS_SUB_COMMAND = 2;            // 鎷兼帴鍙傛暟
-  MAP_INTERFACE_PLATFORM_SUB_COMMAND = 3;     // 鍦板浘鎺ュ彛骞冲彴
-  DATA_STORE_BACKUP_SUB_COMMAND = 4;          // 鏁版嵁瀛樺偍澶囦唤
+//   // 鏍稿績璁$畻鍙傛暟璁剧疆
+//   POINT_CLOUD_ACCURACY_SUB_COMMAND = 1;       // 鐐逛簯璁$畻绮惧害
+//   SPLICING_PARAMS_SUB_COMMAND = 2;            // 鎷兼帴鍙傛暟
+//   MAP_INTERFACE_PLATFORM_SUB_COMMAND = 3;     // 鍦板浘鎺ュ彛骞冲彴
+//   DATA_STORE_BACKUP_SUB_COMMAND = 4;          // 鏁版嵁瀛樺偍澶囦唤
 
-  // 宸ヤ綔璁惧鍙傛暟璁剧疆
-  SYSTEM_TIMER_SUB_COMMAND = 1;               // 绯荤粺宸ヤ綔瀹氭椂
-  SYSTEM_COORD_HEIGHT_SUB_COMMAND = 2;        // 宸ヤ綔鍖哄煙鍧愭爣涓庨珮搴�
-  TRIGGER_CONDITION_SUB_COMMAND = 3;          // 宸ヤ綔瑙﹀彂鏉′欢
-  GRAVITY_FAILURE_SUB_COMMAND = 4;            // 閲嶅姏鍔犻�熷害澶辨晥鍙傛暟
-  NINE_AXIS_FAILURE_SUB_COMMAND = 5;          // 涔濊酱鍔犻�熷害澶辨晥鍙傛暟
+//   // 宸ヤ綔璁惧鍙傛暟璁剧疆
+//   SYSTEM_TIMER_SUB_COMMAND = 1;               // 绯荤粺宸ヤ綔瀹氭椂
+//   SYSTEM_COORD_HEIGHT_SUB_COMMAND = 2;        // 宸ヤ綔鍖哄煙鍧愭爣涓庨珮搴�
+//   TRIGGER_CONDITION_SUB_COMMAND = 3;          // 宸ヤ綔瑙﹀彂鏉′欢
+//   GRAVITY_FAILURE_SUB_COMMAND = 4;            // 閲嶅姏鍔犻�熷害澶辨晥鍙傛暟
+//   NINE_AXIS_FAILURE_SUB_COMMAND = 5;          // 涔濊酱鍔犻�熷害澶辨晥鍙傛暟
 
-  // 姣背娉�
-  MICRO_WAVE_SUB_COMMAND = 1;                 // 姣背娉�
+//   // 姣背娉�
+//   MICRO_WAVE_SUB_COMMAND = 1;                 // 姣背娉�
+// }
+
+// message DataField {
+//   int32 length = 1;                           // 鏁版嵁闀垮害
+//   bytes data = 2;                            // 鏁版嵁鍐呭
+//   int32 checksum = 3;                        // 鏍¢獙鐮�
+// }
+
+// message CapturedData {
+//   int64 capture_time = 1;                     // 閲囬泦鏃堕棿
+//   string capture_device =2;                   // 閲囬泦璁惧
+//   int32 capture_port = 3;                     // 閲囬泦璁惧搴忓彿
+//   DataField DataField = 4;
+//   string data_type = 5;                         // 鏁版嵁绫诲瀷 image udp
+// }
+
+// message DataMessage{
+//   int64 sending_time = 1;
+//   string sending_device = 2;
+//   string target_device = 3;
+//   CapturedData CapturedData = 5;
+// }
+
+// message StateData {
+//  int64 state_time = 1;
+//  string state_device = 2;
+//  DataField DataField = 4;
+// }
+
+// message StateMessage {
+//   int64 sending_time = 1;
+//   string sending_device = 2;
+//   string target_device = 3;
+//   CapturedData StatedData = 5;
+// }
+
+// message CommandData {
+//   SysCommand SysCommand = 1;
+//   SubCommand SubCommand = 2;
+// }
+
+// message CommandMessage {
+//   int64 sending_time = 1;
+//   string sending_device = 2;
+//   string target_device = 3;
+//   CommandData CommandData =4;
+// }
+
+enum SysCommand{
+  UNKOWN_COMMAND     = 0;
+  CAMERA_COMMAND     = 1;
+  MICROWAVE_COMMAND   = 2;
+  DUSTCLEANER_COMMAND   = 3;
+
 }
 
-message DataField {
-  int32 length = 1;                           // 鏁版嵁闀垮害
-  bytes data = 2;                            // 鏁版嵁鍐呭
-  int32 checksum = 3;                        // 鏍¢獙鐮�
+enum SubCommand{
+  UNKOWN_SUBCOMMAND     = 0;
+
+  // camera params
+  ONE_TIME_CAPTURE      = 1;
+
+  // microwave params
+  ONE_CIRCLE_SCAN       = 2;
+
+  // dust cleaner params
+  ONE_CLEAN_SCAN        = 4;
+
 }
 
-message CapturedData {
-  int64 capture_time = 1;                     // 閲囬泦鏃堕棿
-  string capture_device =2;                   // 閲囬泦璁惧
-  int32 capture_port = 3;                     // 閲囬泦璁惧搴忓彿
-  DataField DataField = 4;
-  string data_type = 5;                         // 鏁版嵁绫诲瀷 image udp
-}
 
-message DataMessage{
-  int64 sending_time = 1;
-  string sending_device = 2;
-  string target_device = 3;
-  CapturedData CapturedData = 5;
-}
-
-message StateData {
- int64 state_time = 1;
- string state_device = 2;
- DataField DataField = 4;
-}
-
-message StateMessage {
-  int64 sending_time = 1;
-  string sending_device = 2;
-  string target_device = 3;
-  CapturedData StatedData = 5;
-}
-
-message CommandData {
-  SysCommand SysCommand = 1;
-  SubCommand SubCommand = 2;
-}
-
-message CommandMessage {
-  int64 sending_time = 1;
-  string sending_device = 2;
-  string target_device = 3;
-  CommandData CommandData =4;
+message CommandMessage{
+  string source = 1;
+  string generatetime = 2;
+  SysCommand syscommand = 3;
+  SubCommand subcommand = 4;
+  string targetclient = 5;
+  string returnserver = 6;
+  string taskuuid = 7;
 }
 
 message LogsMessage{
   string source = 1;
   string timestamp = 2;
   string context = 3;
+  optional string taskuuid = 4;
 }
 
 
@@ -135,6 +169,7 @@
   }
 
   repeated ImageItems Image = 3;
+  optional string taskuuid = 4;
 }
 
 
@@ -156,6 +191,7 @@
   }
 
   repeated PointCloudItem Plydata = 3;
+  optional string taskuuid = 4;
 
   // enum ref_system
   // {
diff --git a/src/utils/tools.py b/src/utils/tools.py
index 8f9fa00..1d1cfc5 100644
--- a/src/utils/tools.py
+++ b/src/utils/tools.py
@@ -1,8 +1,8 @@
-from email import header
+
 import os, sys
 import numpy as np
 import time
-from tqdm import tqdm
+from datetime import datetime
 
 def file_fliter(folder:str, file_ext:str, sort_format = None):
 
@@ -76,10 +76,27 @@
                 header="".join(header),
                 comments="",
                 fmt=fmt)
-    print(f"{time.asctime()} {name}.ply have been saved with {n_p} points!")
+    print(f"{time.asctime()} | {name}.ply have been saved with {n_p} points!")
 
 
 
+def update_folder_for_today(folder_tree:dict[str,str]):
+    """
+    "sup_folder" + "today" +"sub_folder" >> "today_folder"
+    """
+    try:
+        sup = folder_tree["sup_folder"]
+        sub = folder_tree["sub_folder"]
+
+        today = datetime.now().strftime('%Y-%m-%d')
+        today_folder = os.path.join(sup,today,sub)
+
+        folder_tree["today"] = today
+        folder_tree["today_folder"] = today_folder
+    except Exception as e:
+        raise ValueError(f"{e}")
+
+
 if __name__ == "__main__":
     ply_array = read_ply('src\\microwave\\demo\\demoData\\2522.ply')
     

--
Gitblit v1.9.1