From 9411c4e47500e271d8fb88143c86e6dcb2d89684 Mon Sep 17 00:00:00 2001
From: wu_xinjun <bent20140204@outlook.com>
Date: 星期一, 28 二月 2022 10:43:41 +0800
Subject: [PATCH] Merge commit 'f79b30a55db543bd1c7dd494a8c896df8841aa28' into addFeature

---
 src/Microwave/servers.py                     |    2 
 src/Microwave/demo/demoData/packet96.udp     |    0 
 src/microwave/demo/demoData/packet68.udp     |    0 
 src/Microwave/demo/demoData/packet3.udp      |    0 
 src/Microwave/demo/demoData/packet53.udp     |    0 
 src/microwave/demo/demoData/packet25.udp     |    0 
 src/microwave/demo/demoData/packet61.udp     |    0 
 udp2ply.bat                                  |   25 
 src/Microwave/demo/demoData/packet17.udp     |    0 
 src/microwave/demo/demoData/packet17.udp     |    0 
 src/Microwave/demo/demoData/packet61.udp     |    0 
 src/engine/DustCleaner.py                    |    4 
 src/microwave/demo/demoData/packet5.udp      |    0 
 src/Microwave/demo/demoData/packet29.udp     |    0 
 src/Microwave/demo/demoData/packet92.udp     |    0 
 src/microwave/demo/demoData/packet37.udp     |    0 
 src/microwave/demo/AutoSendAndGetTest.bat    |   16 
 src/microwave/demo/demoData/packet53.udp     |    0 
 src/microwave/demo/demoData/packet96.udp     |    0 
 src/Microwave/demo/demoData/packet45.udp     |    0 
 src/microwave/demo/demoData/packet10.udp     |    0 
 src/Microwave/demo/demoData/packet88.udp     |    0 
 src/Microwave/demo/demoData/packet33.udp     |    0 
 src/microwave/demo/demoData/packet84.udp     |    0 
 src/Microwave/demo/demoData/packet76.udp     |    0 
 src/microwave/demo/demoData/packet41.udp     |    0 
 src/microwave/demo/demoData/packet56.udp     |    0 
 src/microwave/demo/demoData/packet81.udp     |    0 
 src/Microwave/demo/demoData/packet30.udp     |    0 
 src/microwave/demo/demoData/packet13.udp     |    0 
 src/utils/plot_ply.py                        |   23 
 src/Microwave/demo/demoData/packet65.udp     |    0 
 src/utils/udp2bin.py                         |   46 +
 src/microwave/demo/demoData/packet99.udp     |    0 
 src/microwave/demo/demoData/packet64.udp     |    0 
 src/microwave/demo/demoData/packet73.udp     |    0 
 src/Microwave/demo/demoData/packet56.udp     |    0 
 src/microwave/demo/demoData/packet21.udp     |    0 
 src/microwave/demo/demoData/packet8.udp      |    0 
 src/Microwave/demo/demoData/packet99.udp     |    0 
 src/microwave/components.py                  |  172 ++++++
 src/Microwave/demo/demoData/packet73.udp     |    0 
 src/Microwave/demo/demoData/packet13.udp     |    0 
 src/microwave/demo/demoData/packet30.udp     |    0 
 src/Microwave/demo/demoData/packet48.udp     |    0 
 src/Microwave/demo/demoData/packet7.udp      |    0 
 src/Microwave/demo/demoData/packet22.udp     |    0 
 src/Microwave/demo/demoData/packet84.udp     |    0 
 src/microwave/servers.py                     |  146 +++++
 src/microwave/demo/demoData/packet45.udp     |    0 
 src/microwave/demo/AutoGetUDPtest.bat        |   22 
 src/microwave/demo/demoData/packet88.udp     |    0 
 src/Microwave/demo/demoData/packet41.udp     |    0 
 udp2bin.bat                                  |   23 
 TEST_ply_show .bat                           |   21 
 src/microwave/demo/demoData/packet92.udp     |    0 
 src/microwave/demo/demoData/packet28.udp     |    0 
 src/microwave/demo/demoData/packet1.udp      |    0 
 src/Microwave/demo/demoData/packet37.udp     |    0 
 src/Microwave/demo/demoData/packet60.udp     |    0 
 src/Microwave/demo/demoData/packet2.udp      |    0 
 src/Microwave/demo/demoData/packet18.udp     |    0 
 src/Microwave/demo/demoData/packet95.udp     |    0 
 src/microwave/demo/demoData/packet85.udp     |    0 
 src/Microwave/demo/demoData/packet79.udp     |    0 
 src/microwave/demo/MicroWave2Ply.py          |   35 +
 src/microwave/demo/demoData/packet18.udp     |    0 
 src/microwave/demo/demoData/packet42.udp     |    0 
 src/Microwave/demo/demoData/packet36.udp     |    0 
 src/microwave/demo/udp_test_get.py           |   63 ++
 src/microwave/demo/demoData/packet4.udp      |    0 
 src/Microwave/demo/demoData/packet69.udp     |    0 
 src/Microwave/demo/demoData/packet26.udp     |    0 
 src/Microwave/demo/demoData/packet70.udp     |    0 
 src/Microwave/demo/demoData/packet52.udp     |    0 
 src/microwave/demo/demoData/packet52.udp     |    0 
 src/microwave/demo/demoData/packet95.udp     |    0 
 src/Microwave/demo/demoData/packet46.udp     |    0 
 src/microwave/demo/demoData/packet70.udp     |    0 
 src/microwave/demo/demoData/packet24.udp     |    0 
 src/Microwave/demo/demoData/packet75.udp     |    0 
 src/Microwave/demo/demoData/packet32.udp     |    0 
 startServer.bat                              |   20 
 src/microwave/demo/demoData/packet79.udp     |    0 
 src/Microwave/demo/demoData/packet80.udp     |    0 
 src/microwave/demo/demoData/packet36.udp     |    0 
 src/Microwave/demo/AutoSendUDPtest.bat       |    2 
 src/microwave/demo/demoData/packet67.udp     |    0 
 src/Microwave/demo/demoData/packet89.udp     |    0 
 src/Microwave/demo/AutoSendAndGetTest.bat    |    2 
 src/microwave/demo/MicroWaveUDPServerTest.py |   57 ++
 .gitignore                                   |  158 -----
 src/Microwave/demo/demoData/packet57.udp     |    0 
 src/Microwave/demo/demoData/packet81.udp     |    0 
 src/Microwave/demo/demoData/packet14.udp     |    0 
 bin2ply.BAT                                  |   21 
 src/utils/tools.py                           |   17 
 src/Microwave/demo/demoData/packet6.udp      |    0 
 src/Microwave/demo/demoData/packet64.udp     |    0 
 src/engine/DeviceManager.py                  |    8 
 src/microwave/demo/demoData/packet57.udp     |    0 
 src/Microwave/demo/demoData/packet21.udp     |    0 
 src/Microwave/demo/demoData/packet47.udp     |    0 
 src/Microwave/demo/demoData/packet91.udp     |    0 
 src/microwave/demo/demoData/packet31.udp     |    0 
 src/Microwave/demo/demoData/packet31.udp     |    0 
 src/microwave/demo/demoData/packet74.udp     |    0 
 src/microwave/demo/demoData/packet91.udp     |    0 
 src/utils/udp_get.py                         |   88 +++
 src/Microwave/demo/demoData/packet74.udp     |    0 
 TEST_startClient.bat                         |   33 +
 .vscode/settings.json                        |   10 
 src/Microwave/demo/demoData/packet68.udp     |    0 
 bin2ply.bat                                  |   21 
 src/Microwave/demo/demoData/packet25.udp     |    0 
 src/microwave/demo/demoData/packet46.udp     |    0 
 src/Microwave/demo/demoData/packet10.udp     |    0 
 src/microwave/demo/demoData/packet0.udp      |    0 
 src/microwave/demo/demoData/packet29.udp     |    0 
 src/microwave/demo/demoData/packet20.udp     |    0 
 src/microwave/demo/demoData/packet14.udp     |    0 
 src/microwave/demo/demoData/packet63.udp     |    0 
 src/Microwave/demo/demoData/packet85.udp     |    0 
 src/microwave/demo/demoData/packet9.udp      |    0 
 src/Microwave/demo/demoData/packet42.udp     |    0 
 src/microwave/demo/demoData/packet89.udp     |    0 
 src/microwave/demo/demoData/packet80.udp     |    0 
 src/Microwave/demo/demoData/packet35.udp     |    0 
 src/microwave/demo/udp_test_send.py          |   21 
 src/Microwave/demo/demoData/packet78.udp     |    0 
 src/microwave/demo/demoData/packet86.udp     |    0 
 src/microwave/demo/demoData/packet51.udp     |    0 
 src/Microwave/demo/demoData/packet43.udp     |    0 
 src/microwave/demo/demoData/packet35.udp     |    0 
 src/Microwave/demo/demoData/packet51.udp     |    0 
 src/Microwave/demo/demoData/packet19.udp     |    0 
 src/Microwave/demo/demoData/packet27.udp     |    0 
 src/Microwave/demo/demoData/packet86.udp     |    0 
 src/microwave/demo/demoData/packet27.udp     |    0 
 src/microwave/demo/demoData/packet94.udp     |    0 
 src/microwave/demo/demoData/packet3.udp      |    0 
 src/microwave/demo/demoData/packet78.udp     |    0 
 src/microwave/demo/demoData/packet43.udp     |    0 
 src/microwave/parsers.py                     |   23 
 src/microwave/demo/demoData/packet23.udp     |    0 
 src/microwave/demo/demoData/packet66.udp     |    0 
 src/engine/AcquisitionMain.py                |    2 
 TEST_udp_get.bat                             |   23 
 src/microwave/demo/demoData/packet19.udp     |    0 
 src/microwave/demo/demoData/packet98.udp     |    0 
 src/utils/bin2ply.py                         |   54 +
 src/Microwave/demo/demoData/packet1.udp      |    0 
 src/Microwave/demo/demoData/packet15.udp     |    0 
 src/Microwave/demo/demoData/packet58.udp     |    0 
 src/Microwave/demo/demoData/packet94.udp     |    0 
 src/Microwave/demo/demoData/packet63.udp     |    0 
 src/Microwave/demo/demoData/packet20.udp     |    0 
 src/microwave/demo/demoData/packet71.udp     |    0 
 src/Microwave/demo/demoData/packet90.udp     |    0 
 src/microwave/demo/demoData/packet39.udp     |    0 
 src/Microwave/demo/demoData/packet82.udp     |    0 
 src/microwave/constants.py                   |    2 
 src/microwave/demo/demoData/packet90.udp     |    0 
 src/Microwave/demo/AutoGetUDPtest.bat        |    2 
 src/microwave/demo/AutoSendUDPtest.bat       |   22 
 src/Client.py                                |   34 
 src/microwave/demo/demoData/packet47.udp     |    0 
 src/Microwave/demo/demoData/packet39.udp     |    0 
 src/Microwave/demo/demoData/packet11.udp     |    0 
 src/microwave/demo/demoData/packet32.udp     |    0 
 src/Microwave/demo/demoData/packet54.udp     |    0 
 src/Microwave/demo/demoData/packet71.udp     |    0 
 src/Microwave/demo/demoData/packet67.udp     |    0 
 src/Microwave/demo/demoData/packet97.udp     |    0 
 src/microwave/demo/demoData/packet62.udp     |    0 
 src/microwave/demo/demoData/packet75.udp     |    0 
 src/Microwave/demo/demoData/packet5.udp      |    0 
 src/microwave/demo/demoData/packet58.udp     |    0 
 src/microwave/demo/demoData/packet15.udp     |    0 
 src/Microwave/demo/demoData/packet24.udp     |    0 
 TEST_udp2ply.bat                             |   23 
 src/microwave/demo/demoData/packet26.udp     |    0 
 src/microwave/demo/demoData/packet34.udp     |    0 
 src/microwave/demo/demoData/packet60.udp     |    0 
 src/microwave/demo/demoData/packet2.udp      |    0 
 src/microwave/demo/demoData/packet77.udp     |    0 
 src/microwave/demo/AutoGetUDP.bat            |   22 
 src/Microwave/demo/demoData/packet34.udp     |    0 
 src/Microwave/demo/demoData/packet77.udp     |    0 
 src/microwave/demo/demoData/packet44.udp     |    0 
 src/microwave/demo/demoData/packet87.udp     |    0 
 src/Microwave/demo/demoData/packet87.udp     |    0 
 src/Server.py                                |   28 
 src/Microwave/demo/demoData/packet44.udp     |    0 
 startClient.bat                              |   20 
 src/microwave/demo/demoData/packet69.udp     |    0 
 src/Microwave/demo/demoData/packet59.udp     |    0 
 src/microwave/demo/MicroWaveReceiverTest.py  |   31 +
 src/Microwave/demo/demoData/packet0.udp      |    0 
 src/Microwave/demo/demoData/packet16.udp     |    0 
 TEST_bin2ply.bat                             |   21 
 src/microwave/demo/demoData/packet83.udp     |    0 
 src/microwave/demo/demoData/packet40.udp     |    0 
 ply_show.bat                                 |   21 
 src/Microwave/demo/demoData/packet62.udp     |    0 
 TEST_startServer.bat                         |   33 +
 src/Microwave/demo/demoData/packet28.udp     |    0 
 src/microwave/demo/demoData/packet6.udp      |    0 
 .vscode/launch.json                          |   82 ++
 src/microwave/demo/demoData/packet49.udp     |    0 
 TEST_udp2bin.bat                             |   21 
 src/Microwave/demo/demoData/packet93.udp     |    0 
 src/microwave/demo/demoData/packet11.udp     |    0 
 src/Microwave/demo/demoData/packet9.udp      |    0 
 src/Microwave/demo/demoData/packet50.udp     |    0 
 src/microwave/demo/demoData/packet97.udp     |    0 
 src/microwave/demo/demoData/packet54.udp     |    0 
 src/engine/MessageQueueThread.py             |    8 
 src/microwave/demo/demoData/packet48.udp     |    0 
 src/microwave/demo/demoData/packet7.udp      |    0 
 src/microwave/demo/demoData/packet72.udp     |    0 
 src/microwave/demo/demoData/packet12.udp     |    0 
 src/Microwave/demo/demoData/packet49.udp     |    0 
 src/Microwave/demo/demoData/packet8.udp      |    0 
 src/microwave/demo/demoData/packet55.udp     |    0 
 src/Microwave/demo/demoData/packet23.udp     |    0 
 src/microwave/demo/demoData/packet38.udp     |    0 
 src/Microwave/demo/demoData/packet66.udp     |    0 
 src/Microwave/demo/demoData/packet40.udp     |    0 
 src/Microwave/demo/demoData/packet83.udp     |    0 
 udp_get.bat                                  |   23 
 src/microwave/demo/demoData/packet22.udp     |    0 
 src/microwave/demo/demoData/packet65.udp     |    0 
 src/microwave/demo/demoData/packet82.udp     |    0 
 src/Microwave/demo/demoData/packet38.udp     |    0 
 src/Microwave/demo/demoData/packet4.udp      |    0 
 src/microwave/demo/demoData/packet59.udp     |    0 
 src/Microwave/demo/AutoGetUDP.bat            |    4 
 src/microwave/demo/polty.ipynb               |   64 ++
 src/microwave/demo/demoData/packet16.udp     |    0 
 src/utils/__init__.py                        |    1 
 src/Microwave/demo/demoData/packet72.udp     |    0 
 src/microwave/demo/demoData/packet93.udp     |    0 
 src/microwave/demo/demoData/packet50.udp     |    0 
 src/Microwave/demo/demoData/packet12.udp     |    0 
 src/Microwave/demo/demoData/packet55.udp     |    0 
 src/microwave/demo/demoData/packet76.udp     |    0 
 src/Microwave/demo/demoData/packet98.udp     |    0 
 src/microwave/demo/demoData/packet33.udp     |    0 
 src/microwave/__init__.py                    |    4 
 250 files changed, 1,440 insertions(+), 184 deletions(-)

diff --git a/.gitignore b/.gitignore
index 5c8a381..ee27965 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,145 +1,23 @@
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
+# cache
+**/__pycache__/
 
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-wheels/
-share/python-wheels/
-*.egg-info/
-.installed.cfg
-*.egg
-MANIFEST
-
-# PyInstaller
-#  Usually these files are written by a python script from a template
-#  before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.nox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*.cover
-*.py,cover
-.hypothesis/
-.pytest_cache/
-cover/
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-local_settings.py
-db.sqlite3
-db.sqlite3-journal
-
-# Flask stuff:
-instance/
-.webassets-cache
-
-# Scrapy stuff:
-.scrapy
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-.pybuilder/
-target/
-
-# Jupyter Notebook
-.ipynb_checkpoints
-
-# IPython
-profile_default/
-ipython_config.py
-
-# pyenv
-#   For a library or package, you might want to ignore these files since the code is
-#   intended to run in multiple environments; otherwise, check them in:
-# .python-version
-
-# pipenv
-#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
-#   However, in case of collaboration, if having platform-specific dependencies or dependencies
-#   having no cross-platform support, pipenv may install dependencies that don't work, or not
-#   install all needed dependencies.
-#Pipfile.lock
-
-# PEP 582; used by e.g. github.com/David-OConnor/pyflow
-__pypackages__/
-
-# Celery stuff
-celerybeat-schedule
-celerybeat.pid
-
-# SageMath parsed files
-*.sage.py
-
-# # Environments
-# .env
-# .venv
-# venv/
-# ENV/
-# env.bak/
-# venv.bak/
-
-# Spyder project settings
-.spyderproject
-.spyproject
-
-# Rope project settings
-.ropeproject
-
-# mkdocs documentation
-/site
-
-# mypy
-.mypy_cache/
-.dmypy.json
-dmypy.json
-
-# Pyre type checker
-.pyre/
-
-# pytype static type analyzer
-.pytype/
-
-# Cython debug symbols
-cython_debug/
-/*.udp
-
-.vs
+# proto
 src/protos/aerial_pb2.py
-src/microwave/demo/*Data/
 
+# env
 env/aerial_deploy
 env/*.gz
+
+# demodata
+src/microwave/demo/saveUdPData/
+
+# data & image & microwave
+Data
+Images
+Images*
+Microwaves
+Manual_Microwave*
+
+# log
+*.log
+
diff --git a/.vscode/launch.json b/.vscode/launch.json
index add5650..c0e1721 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -5,34 +5,92 @@
     "version": "0.2.0",
     "configurations": [
         {
-            "name": "udp server test",
+            "name": "Client_test",
             "type": "python",
             "request": "launch",
-            "program": "src/udp_test/udp.py",
+            "python": "${workspaceFolder}/env/aerial_deploy/python.exe",
+            "program": "${workspaceFolder}/src/Client.py",
+            "args": [
+                "192.168.1.224",
+                "chai",
+                "password123",
+                "aerial_rpc",
+                "pod1",
+                "http://192.168.1.224/api",
+                "localhost"
+            ],
             "console": "integratedTerminal"
         },
         {
-            "name": "Python: 褰撳墠鏂囦欢",
+            "name": "Client_production",
             "type": "python",
             "request": "launch",
-            "program": "${file}",
+            "python": "${workspaceFolder}/env/aerial_deploy/python.exe",
+            "program": "${workspaceFolder}/src/Client.py",
+            "args": [
+                "172.17.17.206",
+                "chai",
+                "password123",
+                "aerial_rpc",
+                "pod1",
+                "http://172.17.17.206/api",
+                "192.168.2.65"
+            ],
             "console": "integratedTerminal"
         },
         {
-            "name": "Python: Flask-Server",
+            "name": "Server_test",
             "type": "python",
+            "python": "${workspaceFolder}/env/aerial_deploy/python.exe",
             "request": "launch",
-            "program": "${workspaceFolder}/src/Server/Server.py",
-            "console": "integratedTerminal",
-            "cwd": "${workspaceFolder}/src/Server"
+            "program": "${workspaceFolder}/src/Server.py",
+            "args": [
+                "localhost",
+                "chai",
+                "password123",
+                "aerial_rpc",
+                "5000",
+                "./Images"
+            ],
+            "console": "integratedTerminal"
         },
         {
-            "name": "Python: parser",
+            "name": "Server_production",
             "type": "python",
             "request": "launch",
-            "program": "${workspaceFolder}/src/Client/ParserTest.py",
-            "console": "integratedTerminal",
-            "cwd": "${workspaceFolder}/src/Client"
+            "python": "${workspaceFolder}/env/aerial_deploy/python.exe",
+            "program": "${workspaceFolder}/src/Server.py",
+            "args": [
+                "172.17.17.206",
+                "chai",
+                "password123",
+                "aerial_rpc",
+                "5000",
+                "./Images"
+            ],
+            "console": "integratedTerminal"
+        },
+        {
+            "name": "udp2bin",
+            "type": "python",
+            "request": "launch",
+            "python": "${workspaceFolder}/env/aerial_deploy/python.exe",
+            "program": "${workspaceFolder}/src/utils/udp2bin.py",
+            "args": [
+                "./Manual_Microwave/pod1-2022-02-21-15-34-45/"
+            ],
+            "console": "integratedTerminal"
+        },
+        {
+            "name": "bin2ply",
+            "type": "python",
+            "request": "launch",
+            "python": "${workspaceFolder}/env/aerial_deploy/python.exe",
+            "program": "${workspaceFolder}/src/utils/bin2ply.py",
+            "args": [
+                "./Manual_Microwave/pod1-2022-02-21-15-34-45/"
+            ],
+            "console": "integratedTerminal"
         }
     ]
 }
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 2082822..91b244f 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -7,5 +7,13 @@
             "--proto_path=${workspaceRoot}/proto",
             "--python_out=${workspaceRoot}/src/protos"
         ]
-    }
+    },
+    "python":{
+    },
+    "jupyter.kernels.filter": [
+        {
+            "type": "jupyterKernelspec",
+            "path": "${workspaceFolder}/env/aerial_deploy/python.exe"
+        }
+    ]
 }
\ No newline at end of file
diff --git a/TEST_bin2ply.bat b/TEST_bin2ply.bat
new file mode 100644
index 0000000..c5e9f1b
--- /dev/null
+++ b/TEST_bin2ply.bat
@@ -0,0 +1,21 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+cd %~dp0
+echo change to path: %cd%
+
+set BINfolder=./Manual_Microwave_test/pod1-2022-02-21-15-34-45/
+
+@REM ---------------Usage: bin2ply.py [BINfolder]
+%aerialpython% ./src/utils/bin2ply.py %BINfolder%
+pause
\ No newline at end of file
diff --git a/TEST_ply_show .bat b/TEST_ply_show .bat
new file mode 100644
index 0000000..aefd521
--- /dev/null
+++ b/TEST_ply_show .bat
@@ -0,0 +1,21 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+
+cd %~dp0
+echo change to path: %cd%
+
+set PLYfile=./Manual_Microwave_test/pod1-2022-02-22-15-44-51/28344.ply
+@REM -------------- Usage: plot_ply.py [PLYfile]"
+%aerialpython% ./src/utils/plot_ply.py %PLYfile%
+pause
\ No newline at end of file
diff --git a/TEST_startClient.bat b/TEST_startClient.bat
new file mode 100644
index 0000000..69df83a
--- /dev/null
+++ b/TEST_startClient.bat
@@ -0,0 +1,33 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+
+set MQhost=192.168.1.224
+set MQuser=chai
+set MQpassword=password123
+set QUEUEname=aerial_rpc
+set DEVICEname=pod1
+set SERVERhost=http://192.168.1.224/api
+set MICROWAVEhost=localhost
+set LOGfile=ClientTEST.log
+
+cd %~dp0
+echo change to path: %cd%
+@REM Launch the Client
+echo the log file will be saved in the [%LOGfile%] file
+echo Client.py is running ...
+@REM -------- Usage: Client.py [MQhost] [MQuser] [MQpassword] [QUEUEname] [DEVICEname] [SERVERhost] [MICROWAVEhost]
+@REM %aerialpython% ./src/Client.py %MQhost% %MQuser% %MQpassword% %QUEUEname% %DEVICEname% %SERVERhost% %MICROWAVEhost% >> %LOGfile%
+%aerialpython% ./src/Client.py %MQhost% %MQuser% %MQpassword% %QUEUEname% %DEVICEname% %SERVERhost% %MICROWAVEhost%
+echo Client.py has been terminited.
+pause
diff --git a/TEST_startServer.bat b/TEST_startServer.bat
new file mode 100644
index 0000000..30abc3a
--- /dev/null
+++ b/TEST_startServer.bat
@@ -0,0 +1,33 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+cd %~dp0
+echo change to path: %cd%
+
+set MQhost=localhost
+set MQuser=chai
+set MQpassword=password123
+set QUEUEname=aerial_rpc
+set WEBport=5000
+set SAVEfolder=./ImagesTEST
+set LOGfile=ServerTEST.log
+
+@REM Launch the Server
+@REM -------- Usage: Server.py [MQhost] [MQuser] [MQpassword] [QUEUEname] [WEBport] [SAVEfolder]")
+echo the log file will be saved in the [%LOGfile%] file
+echo Server.py is running ...
+@REM -------- Usage: Server.py [MQhost] [MQuser] [MQpassword] [QUEUEname] [WEBport] [SAVEfolder]")
+%aerialpython% ./src/Server.py %MQhost% %MQuser% %MQpassword% %QUEUEname% %WEBport% %SAVEfolder% >> %LOGfile%
+echo Server.py has been terminited.
+pause
+
diff --git a/TEST_udp2bin.bat b/TEST_udp2bin.bat
new file mode 100644
index 0000000..695816f
--- /dev/null
+++ b/TEST_udp2bin.bat
@@ -0,0 +1,21 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+cd %~dp0
+echo change to path: %cd%
+
+set UDPfolder=./Manual_Microwave_test/pod1-2022-02-21-15-34-45/
+
+@REM ---------------Usage: udp2bin.py [UDPfolder]
+%aerialpython% ./src/utils/udp2bin.py %UDPfolder%
+pause
\ No newline at end of file
diff --git a/TEST_udp2ply.bat b/TEST_udp2ply.bat
new file mode 100644
index 0000000..8b6fec7
--- /dev/null
+++ b/TEST_udp2ply.bat
@@ -0,0 +1,23 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+cd %~dp0
+echo change to path: %cd%
+
+set UDPfolder=./Manual_Microwave_test/pod1-2022-02-22-15-44-51/
+
+@REM ---------------Usage: udp2bin.py [UDPfolder]
+%aerialpython% ./src/utils/udp2bin.py %UDPfolder%
+@REM ---------------Usage: bin2ply.py [BINfolder]
+%aerialpython% ./src/utils/bin2ply.py %UDPfolder%
+pause
\ No newline at end of file
diff --git a/TEST_udp_get.bat b/TEST_udp_get.bat
new file mode 100644
index 0000000..183989d
--- /dev/null
+++ b/TEST_udp_get.bat
@@ -0,0 +1,23 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+cd %~dp0
+echo change to path: %cd%
+
+set MICROWAVEhost=192.168.2.65
+SET PACKETthreshold=1000
+SET DEVICEname=pod1
+SET SAVEfolder=./Manual_Microwave_test
+@REM ---------------Usage: udp_get.py [MICROWAVEhost] [PACKETthreshold] [DEVICEname] [SAVEfolder]
+%aerialpython% ./src/utils/udp_get.py %MICROWAVEhost% %PACKETthreshold% %DEVICEname% %SAVEfolder%
+pause
\ No newline at end of file
diff --git a/bin2ply.BAT b/bin2ply.BAT
new file mode 100644
index 0000000..a36a6f1
--- /dev/null
+++ b/bin2ply.BAT
@@ -0,0 +1,21 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+cd %~dp0
+echo change to path: %cd%
+@REM please the folder path of the bin files.
+@REM set BINfolder=./Manual_Microwave/pod1-2012-12-12-12-12-12/
+
+@REM ---------------Usage: bin2ply.py [BINfolder]
+%aerialpython% ./src/utils/bin2ply.py %BINfolder%
+pause
\ No newline at end of file
diff --git a/bin2ply.bat b/bin2ply.bat
new file mode 100644
index 0000000..a36a6f1
--- /dev/null
+++ b/bin2ply.bat
@@ -0,0 +1,21 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+cd %~dp0
+echo change to path: %cd%
+@REM please the folder path of the bin files.
+@REM set BINfolder=./Manual_Microwave/pod1-2012-12-12-12-12-12/
+
+@REM ---------------Usage: bin2ply.py [BINfolder]
+%aerialpython% ./src/utils/bin2ply.py %BINfolder%
+pause
\ No newline at end of file
diff --git a/ply_show.bat b/ply_show.bat
new file mode 100644
index 0000000..672b8c6
--- /dev/null
+++ b/ply_show.bat
@@ -0,0 +1,21 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+cd %~dp0
+echo change to path: %cd%
+@REM please the folder path of the bin files.
+@REM set PLYfile=./Manual_Microwave/pod1-2022-02-21-15-34-45/2522.ply
+
+@REM -------------- Usage: plot_ply.py [PLYfile]"
+%aerialpython% ./src/utils/plot_ply.py %PLYfile%
+pause
\ No newline at end of file
diff --git a/src/Client.py b/src/Client.py
index 3e0b982..3758f0f 100644
--- a/src/Client.py
+++ b/src/Client.py
@@ -13,6 +13,26 @@
     sys.exit()
 
 if __name__ == '__main__':
+    def help():
+        print("Usage: Client.py [MQhost] [MQuser] [MQpassword] [QUEUEname] [DEVICEname] [SERVERhost] [MICROWAVEhost]")
+        print("EXAMPLE: Client.py 172.17.17.206 chai password123 aerial_rpc pod1 http://172.17.17.206/api 192.168.2.65")
+        exit(1)
+
+    if len(sys.argv) != 8:
+        help()
+    try:
+        MQhost = str(sys.argv[1])
+        MQuser = str(sys.argv[2])
+        MQpassword = str(sys.argv[3])
+        QUEUEname = str(sys.argv[4])
+        DEVICEname = str(sys.argv[5])
+        SERVERhost = str(sys.argv[6])
+        MICROWAVEhost = str(sys.argv[7])
+
+    except Exception as e:
+        print(e)
+        help()
+
     print("Start AcquisitionMain")
     signal.signal(signal.SIGINT, quit)
     signal.signal(signal.SIGTERM, quit)
@@ -21,12 +41,12 @@
     config_dir = os.path.join(__file__, "..", "config.json" )
     config_path = os.path.abspath(config_dir)
     config = Config(config_path)
-    client = AcquisitionMain('localhost',
-                             'chai',
-                             'password123', 
-                             'aerial_rpc', 
-                             'pod1', 
-                             'http://localhost:5000/api', 
-                             'localhost', # udp server host, 192.168.2.65 for production
+    client = AcquisitionMain(MQhost,
+                             MQuser,
+                             MQpassword, 
+                             QUEUEname, 
+                             DEVICEname, 
+                             SERVERhost, 
+                             MICROWAVEhost, # udp server host, 192.168.2.65 for production
                              config)
     client.start()
diff --git a/src/Microwave/demo/AutoGetUDP.bat b/src/Microwave/demo/AutoGetUDP.bat
index 50193ba..9db842c 100644
--- a/src/Microwave/demo/AutoGetUDP.bat
+++ b/src/Microwave/demo/AutoGetUDP.bat
@@ -9,12 +9,12 @@
 
 @REM Setting the env
 if not exist %aerialpython% (
-    %envsetting% 
+    call %envsetting% 
 )
 
 echo All data will be save in '%cd%/saveUDPData/' folder
 
-%aerialpython% udp_test_get.py test
+%aerialpython% udp_test_get.py microwave
 
 echo =========== ALL DONE ================
 
diff --git a/src/Microwave/demo/AutoGetUDPtest.bat b/src/Microwave/demo/AutoGetUDPtest.bat
index 23bba97..c8120ce 100644
--- a/src/Microwave/demo/AutoGetUDPtest.bat
+++ b/src/Microwave/demo/AutoGetUDPtest.bat
@@ -9,7 +9,7 @@
 
 @REM Setting the env
 if not exist %aerialpython% (
-    %envsetting% 
+    call %envsetting% 
 )
 
 echo All data will be saved in '%cd%/saveUDPData/' folder
diff --git a/src/Microwave/demo/AutoSendAndGetTest.bat b/src/Microwave/demo/AutoSendAndGetTest.bat
index c3029c1..73f4873 100644
--- a/src/Microwave/demo/AutoSendAndGetTest.bat
+++ b/src/Microwave/demo/AutoSendAndGetTest.bat
@@ -9,7 +9,7 @@
 
 @REM Setting the env
 if not exist %aerialpython% (
-    %envsetting% 
+    call %envsetting% 
 )
 
 start AutoGetUDPtest.bat 
diff --git a/src/Microwave/demo/AutoSendUDPtest.bat b/src/Microwave/demo/AutoSendUDPtest.bat
index 79ca0d8..f321d14 100644
--- a/src/Microwave/demo/AutoSendUDPtest.bat
+++ b/src/Microwave/demo/AutoSendUDPtest.bat
@@ -9,7 +9,7 @@
 
 @REM Setting the env
 if not exist %aerialpython% (
-    %envsetting% 
+    call %envsetting% 
 )
 
 echo All data saved in '%cd%/demoUDPData/' folder will be sent to 127.0.0.1:9911
diff --git a/src/Microwave/demo/demoData/packet0.udp b/src/Microwave/demo/demoData/packet0.udp
new file mode 100644
index 0000000..45ec6af
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet0.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet1.udp b/src/Microwave/demo/demoData/packet1.udp
new file mode 100644
index 0000000..bdcd817
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet1.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet10.udp b/src/Microwave/demo/demoData/packet10.udp
new file mode 100644
index 0000000..cbdae1b
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet10.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet11.udp b/src/Microwave/demo/demoData/packet11.udp
new file mode 100644
index 0000000..47e9442
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet11.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet12.udp b/src/Microwave/demo/demoData/packet12.udp
new file mode 100644
index 0000000..15ae507
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet12.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet13.udp b/src/Microwave/demo/demoData/packet13.udp
new file mode 100644
index 0000000..c6b1347
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet13.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet14.udp b/src/Microwave/demo/demoData/packet14.udp
new file mode 100644
index 0000000..276ad97
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet14.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet15.udp b/src/Microwave/demo/demoData/packet15.udp
new file mode 100644
index 0000000..f1edce3
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet15.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet16.udp b/src/Microwave/demo/demoData/packet16.udp
new file mode 100644
index 0000000..3ecac02
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet16.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet17.udp b/src/Microwave/demo/demoData/packet17.udp
new file mode 100644
index 0000000..6c01a95
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet17.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet18.udp b/src/Microwave/demo/demoData/packet18.udp
new file mode 100644
index 0000000..6f5d34b
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet18.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet19.udp b/src/Microwave/demo/demoData/packet19.udp
new file mode 100644
index 0000000..979e72a
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet19.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet2.udp b/src/Microwave/demo/demoData/packet2.udp
new file mode 100644
index 0000000..c1b9840
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet2.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet20.udp b/src/Microwave/demo/demoData/packet20.udp
new file mode 100644
index 0000000..90b9361
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet20.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet21.udp b/src/Microwave/demo/demoData/packet21.udp
new file mode 100644
index 0000000..1c42e28
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet21.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet22.udp b/src/Microwave/demo/demoData/packet22.udp
new file mode 100644
index 0000000..144c58f
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet22.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet23.udp b/src/Microwave/demo/demoData/packet23.udp
new file mode 100644
index 0000000..3955833
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet23.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet24.udp b/src/Microwave/demo/demoData/packet24.udp
new file mode 100644
index 0000000..6ca2a5b
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet24.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet25.udp b/src/Microwave/demo/demoData/packet25.udp
new file mode 100644
index 0000000..ba36f9e
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet25.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet26.udp b/src/Microwave/demo/demoData/packet26.udp
new file mode 100644
index 0000000..e919a43
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet26.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet27.udp b/src/Microwave/demo/demoData/packet27.udp
new file mode 100644
index 0000000..2075503
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet27.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet28.udp b/src/Microwave/demo/demoData/packet28.udp
new file mode 100644
index 0000000..16544f4
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet28.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet29.udp b/src/Microwave/demo/demoData/packet29.udp
new file mode 100644
index 0000000..dd261f7
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet29.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet3.udp b/src/Microwave/demo/demoData/packet3.udp
new file mode 100644
index 0000000..4648123
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet3.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet30.udp b/src/Microwave/demo/demoData/packet30.udp
new file mode 100644
index 0000000..b8179c4
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet30.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet31.udp b/src/Microwave/demo/demoData/packet31.udp
new file mode 100644
index 0000000..9772cb9
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet31.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet32.udp b/src/Microwave/demo/demoData/packet32.udp
new file mode 100644
index 0000000..c64b0af
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet32.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet33.udp b/src/Microwave/demo/demoData/packet33.udp
new file mode 100644
index 0000000..702ac41
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet33.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet34.udp b/src/Microwave/demo/demoData/packet34.udp
new file mode 100644
index 0000000..79dccdc
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet34.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet35.udp b/src/Microwave/demo/demoData/packet35.udp
new file mode 100644
index 0000000..eab9861
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet35.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet36.udp b/src/Microwave/demo/demoData/packet36.udp
new file mode 100644
index 0000000..9ac7d57
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet36.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet37.udp b/src/Microwave/demo/demoData/packet37.udp
new file mode 100644
index 0000000..e851049
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet37.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet38.udp b/src/Microwave/demo/demoData/packet38.udp
new file mode 100644
index 0000000..8f3f3de
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet38.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet39.udp b/src/Microwave/demo/demoData/packet39.udp
new file mode 100644
index 0000000..218e0c0
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet39.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet4.udp b/src/Microwave/demo/demoData/packet4.udp
new file mode 100644
index 0000000..8fbfa0e
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet4.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet40.udp b/src/Microwave/demo/demoData/packet40.udp
new file mode 100644
index 0000000..30da04c
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet40.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet41.udp b/src/Microwave/demo/demoData/packet41.udp
new file mode 100644
index 0000000..427cb47
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet41.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet42.udp b/src/Microwave/demo/demoData/packet42.udp
new file mode 100644
index 0000000..580cebd
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet42.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet43.udp b/src/Microwave/demo/demoData/packet43.udp
new file mode 100644
index 0000000..efbccb5
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet43.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet44.udp b/src/Microwave/demo/demoData/packet44.udp
new file mode 100644
index 0000000..93722e8
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet44.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet45.udp b/src/Microwave/demo/demoData/packet45.udp
new file mode 100644
index 0000000..ac7f7a1
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet45.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet46.udp b/src/Microwave/demo/demoData/packet46.udp
new file mode 100644
index 0000000..7571a79
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet46.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet47.udp b/src/Microwave/demo/demoData/packet47.udp
new file mode 100644
index 0000000..022174c
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet47.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet48.udp b/src/Microwave/demo/demoData/packet48.udp
new file mode 100644
index 0000000..028df1f
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet48.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet49.udp b/src/Microwave/demo/demoData/packet49.udp
new file mode 100644
index 0000000..fd55199
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet49.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet5.udp b/src/Microwave/demo/demoData/packet5.udp
new file mode 100644
index 0000000..b1be8fa
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet5.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet50.udp b/src/Microwave/demo/demoData/packet50.udp
new file mode 100644
index 0000000..63a569c
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet50.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet51.udp b/src/Microwave/demo/demoData/packet51.udp
new file mode 100644
index 0000000..2592ed5
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet51.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet52.udp b/src/Microwave/demo/demoData/packet52.udp
new file mode 100644
index 0000000..af91f8a
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet52.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet53.udp b/src/Microwave/demo/demoData/packet53.udp
new file mode 100644
index 0000000..aa07cce
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet53.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet54.udp b/src/Microwave/demo/demoData/packet54.udp
new file mode 100644
index 0000000..a3ecd0a
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet54.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet55.udp b/src/Microwave/demo/demoData/packet55.udp
new file mode 100644
index 0000000..b02a1f3
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet55.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet56.udp b/src/Microwave/demo/demoData/packet56.udp
new file mode 100644
index 0000000..94ab22f
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet56.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet57.udp b/src/Microwave/demo/demoData/packet57.udp
new file mode 100644
index 0000000..8f7132c
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet57.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet58.udp b/src/Microwave/demo/demoData/packet58.udp
new file mode 100644
index 0000000..b78bcd5
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet58.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet59.udp b/src/Microwave/demo/demoData/packet59.udp
new file mode 100644
index 0000000..c91c8a7
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet59.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet6.udp b/src/Microwave/demo/demoData/packet6.udp
new file mode 100644
index 0000000..fde0113
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet6.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet60.udp b/src/Microwave/demo/demoData/packet60.udp
new file mode 100644
index 0000000..2f5012a
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet60.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet61.udp b/src/Microwave/demo/demoData/packet61.udp
new file mode 100644
index 0000000..efb3fd9
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet61.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet62.udp b/src/Microwave/demo/demoData/packet62.udp
new file mode 100644
index 0000000..1dc13e5
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet62.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet63.udp b/src/Microwave/demo/demoData/packet63.udp
new file mode 100644
index 0000000..39fb456
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet63.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet64.udp b/src/Microwave/demo/demoData/packet64.udp
new file mode 100644
index 0000000..2b31395
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet64.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet65.udp b/src/Microwave/demo/demoData/packet65.udp
new file mode 100644
index 0000000..cc20dd3
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet65.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet66.udp b/src/Microwave/demo/demoData/packet66.udp
new file mode 100644
index 0000000..cc9834a
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet66.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet67.udp b/src/Microwave/demo/demoData/packet67.udp
new file mode 100644
index 0000000..7bd1728
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet67.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet68.udp b/src/Microwave/demo/demoData/packet68.udp
new file mode 100644
index 0000000..cbdae1b
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet68.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet69.udp b/src/Microwave/demo/demoData/packet69.udp
new file mode 100644
index 0000000..09bbe10
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet69.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet7.udp b/src/Microwave/demo/demoData/packet7.udp
new file mode 100644
index 0000000..f39b222
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet7.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet70.udp b/src/Microwave/demo/demoData/packet70.udp
new file mode 100644
index 0000000..f0f22f1
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet70.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet71.udp b/src/Microwave/demo/demoData/packet71.udp
new file mode 100644
index 0000000..4a6e31c
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet71.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet72.udp b/src/Microwave/demo/demoData/packet72.udp
new file mode 100644
index 0000000..6aa2d01
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet72.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet73.udp b/src/Microwave/demo/demoData/packet73.udp
new file mode 100644
index 0000000..ef5e1e2
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet73.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet74.udp b/src/Microwave/demo/demoData/packet74.udp
new file mode 100644
index 0000000..abad527
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet74.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet75.udp b/src/Microwave/demo/demoData/packet75.udp
new file mode 100644
index 0000000..84cf797
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet75.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet76.udp b/src/Microwave/demo/demoData/packet76.udp
new file mode 100644
index 0000000..88b736a
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet76.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet77.udp b/src/Microwave/demo/demoData/packet77.udp
new file mode 100644
index 0000000..0b3ff02
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet77.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet78.udp b/src/Microwave/demo/demoData/packet78.udp
new file mode 100644
index 0000000..1be3d16
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet78.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet79.udp b/src/Microwave/demo/demoData/packet79.udp
new file mode 100644
index 0000000..78066c9
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet79.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet8.udp b/src/Microwave/demo/demoData/packet8.udp
new file mode 100644
index 0000000..e253b20
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet8.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet80.udp b/src/Microwave/demo/demoData/packet80.udp
new file mode 100644
index 0000000..ac896f2
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet80.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet81.udp b/src/Microwave/demo/demoData/packet81.udp
new file mode 100644
index 0000000..2b31395
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet81.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet82.udp b/src/Microwave/demo/demoData/packet82.udp
new file mode 100644
index 0000000..81c14a1
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet82.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet83.udp b/src/Microwave/demo/demoData/packet83.udp
new file mode 100644
index 0000000..c8a9c4d
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet83.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet84.udp b/src/Microwave/demo/demoData/packet84.udp
new file mode 100644
index 0000000..7fa678f
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet84.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet85.udp b/src/Microwave/demo/demoData/packet85.udp
new file mode 100644
index 0000000..a0ec621
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet85.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet86.udp b/src/Microwave/demo/demoData/packet86.udp
new file mode 100644
index 0000000..9c707b5
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet86.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet87.udp b/src/Microwave/demo/demoData/packet87.udp
new file mode 100644
index 0000000..8d608a5
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet87.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet88.udp b/src/Microwave/demo/demoData/packet88.udp
new file mode 100644
index 0000000..db31558
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet88.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet89.udp b/src/Microwave/demo/demoData/packet89.udp
new file mode 100644
index 0000000..1077acf
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet89.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet9.udp b/src/Microwave/demo/demoData/packet9.udp
new file mode 100644
index 0000000..411ee5c
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet9.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet90.udp b/src/Microwave/demo/demoData/packet90.udp
new file mode 100644
index 0000000..68a44a8
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet90.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet91.udp b/src/Microwave/demo/demoData/packet91.udp
new file mode 100644
index 0000000..aa7fac1
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet91.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet92.udp b/src/Microwave/demo/demoData/packet92.udp
new file mode 100644
index 0000000..5d4b12f
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet92.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet93.udp b/src/Microwave/demo/demoData/packet93.udp
new file mode 100644
index 0000000..273e0bf
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet93.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet94.udp b/src/Microwave/demo/demoData/packet94.udp
new file mode 100644
index 0000000..c519c4e
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet94.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet95.udp b/src/Microwave/demo/demoData/packet95.udp
new file mode 100644
index 0000000..f72c0fb
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet95.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet96.udp b/src/Microwave/demo/demoData/packet96.udp
new file mode 100644
index 0000000..a7614ef
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet96.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet97.udp b/src/Microwave/demo/demoData/packet97.udp
new file mode 100644
index 0000000..cd53dd6
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet97.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet98.udp b/src/Microwave/demo/demoData/packet98.udp
new file mode 100644
index 0000000..427d702
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet98.udp
Binary files differ
diff --git a/src/Microwave/demo/demoData/packet99.udp b/src/Microwave/demo/demoData/packet99.udp
new file mode 100644
index 0000000..6ccc285
--- /dev/null
+++ b/src/Microwave/demo/demoData/packet99.udp
Binary files differ
diff --git a/src/Microwave/servers.py b/src/Microwave/servers.py
index 9ce2a7f..e9c315b 100644
--- a/src/Microwave/servers.py
+++ b/src/Microwave/servers.py
@@ -132,7 +132,7 @@
             data1_str = data1.SerializeToString()
             msg.data1.length = len(data1_str)
             msg.data1.data = data1_str
-            self.msg_queue.put(msg)
+            self.server.msg_queue.put(msg)
 
 
 class MicroWaveUDPServer(UDPServer):
diff --git a/src/Server.py b/src/Server.py
index f0e8ca2..b2e41a4 100644
--- a/src/Server.py
+++ b/src/Server.py
@@ -35,9 +35,9 @@
     def _on_sys_command(self, req: pb.RequestCommand, resp: pb.ResponseCommand):
         if pb.SubCommand.POWER_ON_SUB_COMMAND == req.sub_command:
             print('power on message received')
-            self._device_manager.get_device(req.device_id)
+            self._device_manager.get_device(req.device_id,save_folder)
         elif pb.SubCommand.POWER_OFF_SUB_COMMAND == req.sub_command:
-            device = self._device_manager.get_device(req.device_id)
+            device = self._device_manager.get_device(req.device_id,save_folder)
             device['power_on'] = False
             print('power off message received')
         return
@@ -63,7 +63,7 @@
 
     def run_rabbitmq(self, host: str, user: str, password: str, queue: str) -> None:
         self._message_queue_thread = MessageQueueThread(
-            host, user, password, queue, self._device_manager)
+            host, user, password, queue, self._device_manager, save_folder)
         self._message_queue_thread.start()
 
     def run_all(self):
@@ -71,7 +71,7 @@
         self.run(debug=False, host="0.0.0.0", port=self.port)
 
     def send_controll_message(self, device_id, msg):
-        device = self._device_manager.get_device(device_id)
+        device = self._device_manager.get_device(device_id,save_folder)
         if device is None:
             channel = device.controll_channel
             channel.basic_publish(
@@ -91,5 +91,25 @@
 
 
 if __name__ == "__main__":
+    def help():
+        print("Usage: Server.py [MQhost] [MQuser] [MQpassword] [QUEUEname] [WEBport] [SAVEfolder]")
+        print("EXAMPLE: Server.py localhost chai password123 aerial_rpc 5000 ./Images")
+        exit(1)
+
+    if len(sys.argv) != 7:
+        help()
+    try:
+        MQhost = str(sys.argv[1])
+        MQuser = str(sys.argv[2])
+        MQpassword = str(sys.argv[3])
+        QUEUEname = str(sys.argv[4])
+        WEBport = int(sys.argv[5])
+        SAVEfolder = str(sys.argv[6])
+        global save_folder
+        save_folder = SAVEfolder
+
+    except Exception as e:
+        print(e)
+        help()
     server = MyServer(host="localhost", user='chai', password='password123', queue='aerial_rpc', port=5000)
     server.run_all()
diff --git a/src/engine/AcquisitionMain.py b/src/engine/AcquisitionMain.py
index 24f9c01..4373fa6 100644
--- a/src/engine/AcquisitionMain.py
+++ b/src/engine/AcquisitionMain.py
@@ -239,7 +239,7 @@
                 if not self.msg_queue.empty():
                     msg = self.msg_queue.get()
                     self._send_data(msg)
-                    print("send message")
+                    print(time.asctime(), "send message")
                 time.sleep(0.1)
             except Exception as e:
                 break
diff --git a/src/engine/DeviceManager.py b/src/engine/DeviceManager.py
index 7909d32..e0ccb19 100644
--- a/src/engine/DeviceManager.py
+++ b/src/engine/DeviceManager.py
@@ -19,13 +19,13 @@
         channel.queue_declare(queue=device_id + "_callback")
         return channel
 
-    def get_device(self, device_id: str):
+    def get_device(self, device_id: str, save_folder: str):
         device = self._devices.get(device_id, None)
         if device is None:
             start = datetime.datetime.now()
-            if not os.path.exists('./Images'):
-                os.mkdir('./Images')
-            path = f"./Images/{device_id}-{start.strftime('%Y-%m-%d-%H-%M-%S')}"
+            if not os.path.exists(save_folder):
+                os.mkdir(save_folder)
+            path = os.path.join(save_folder,f"{device_id}-{start.strftime('%Y-%m-%d-%H-%M-%S')}")
             if not os.path.exists(path):
                 os.mkdir(path)
             device = dict(
diff --git a/src/engine/DustCleaner.py b/src/engine/DustCleaner.py
index 620a086..27533c8 100644
--- a/src/engine/DustCleaner.py
+++ b/src/engine/DustCleaner.py
@@ -55,7 +55,7 @@
 
     # 鍙戞暟鎹�
     def Send(self, data):
-        if (not self.com_port is None) and self.com_port.is_open():
+        if (not self.com_port is None) and self.com_port.is_open:
             self.com_port.write(data)
             self.Recive()
 
@@ -97,7 +97,7 @@
         self.SendNoChecksum(bytes([0x5A, 0x07, 0x73, start_angle, end_angle, num, 0x00]))
 
     def Recive(self):
-        return self.main_engine.read_all()
+        return self.com_port.read_all()
 
 
 if __name__ == '__main__':
diff --git a/src/engine/MessageQueueThread.py b/src/engine/MessageQueueThread.py
index d72f7df..16396af 100644
--- a/src/engine/MessageQueueThread.py
+++ b/src/engine/MessageQueueThread.py
@@ -19,9 +19,11 @@
                  user: str, 
                  password: str, 
                  queue: str, 
-                 device_manager: DeviceManager):
+                 device_manager: DeviceManager,
+                 save_folder: str):
         threading.Thread.__init__(self)
         self._device_manager = device_manager
+        self.save_folder = save_folder
         self._def_routes()
         self.message_received: int = 0
 
@@ -58,7 +60,7 @@
             print(
                 f'send image sub command received, length={req.data1.length}')
             if req.data1.length > 0:
-                device = self._device_manager.get_device(req.device_id)
+                device = self._device_manager.get_device(req.device_id, self.save_folder)
                 img_msg = pb.ImagesMessage()
                 img_msg.ParseFromString(req.data1.data)
                 # print(img_msg.image1)
@@ -74,7 +76,7 @@
         print('micro wave command')
         if pb.SubCommand.MICRO_WAVE_SUB_COMMAND == req.sub_command:
             print('micro wave sub command received')
-            device = self._device_manager.get_device(req.device_id)
+            device = self._device_manager.get_device(req.device_id,self.save_folder)
             micro_wave_msg = pb.MicroWaveMessage()
             micro_wave_msg.ParseFromString(req.data1.data)
             if (micro_wave_msg.length == len(micro_wave_msg.data)):
diff --git a/src/microwave/__init__.py b/src/microwave/__init__.py
new file mode 100644
index 0000000..44c7895
--- /dev/null
+++ b/src/microwave/__init__.py
@@ -0,0 +1,4 @@
+from .components import *
+from  .constants import *
+from  .parsers import *
+from  .servers import *
\ No newline at end of file
diff --git a/src/microwave/components.py b/src/microwave/components.py
new file mode 100644
index 0000000..2019759
--- /dev/null
+++ b/src/microwave/components.py
@@ -0,0 +1,172 @@
+from ctypes import Structure, c_ubyte, c_uint16, c_uint32, c_int16
+from bitarray import bitarray, util
+import math
+
+"""
+    UDP packets 0  --> ... --> UDP packets n
+Handshake --> HeaderBlock --> DetectionBlock --> TrackerBlock --> FooterBlock
+
+"""
+
+
+class Handshake(Structure):
+    """
+    Handshake structure, 24 bytes
+    """
+    _pack_ = 1
+    _fields_ = [
+        ('Magic', c_ubyte*8),
+        ('FrameDataLength', c_uint32),
+        ('Reserved', c_ubyte * 12)
+        ]
+
+
+class HeaderBlock(Structure):
+    """
+    Header structure, 48 bytes
+    """
+    _pack_ = 1
+    _fields_ = [
+        ('Magic', c_ubyte * 8),             # [2 1 4 3 6 5 8 7]
+        ('FrameNumber', c_uint32),          # frame number
+        ('VersionNumber', c_uint32),        # Version number, uint32_t format: MMddhhmm
+        ('NumberOfDetection', c_uint16),    # Number of Detection in the frame
+        ('NumberOfTrack', c_uint16),        # Number of Detection in the frame
+        ('HostSpeed', c_uint16),            # divide by 100 to get ego speed in m/s (e.g. 6453 = 64.53 m/s, e.g. -2456 = -24.56 m/s)
+        ('HostAngle', c_uint16),            # divide by 100 to get host angle in degree. Clockwise rotation corresponds to positive rotation.(e.g. 1400 = 14 deg)
+        ('Reserved', c_ubyte * 8),
+        ('RangeAccuracyIdx', c_uint16),     # divide by 10000 to get value in m
+        ('DopplerAccuracyIdx', c_uint16),   # divide by 10000 to get value in m/s
+        ('AzimuthAccuracyIdx', c_uint16),   # divide by 10000 to get value in degree
+        ('ElevationAccuracyIdx', c_uint16), # divide by 10000 to get value in degree
+        ('DspWorkload', c_ubyte),
+        ('ARMWorkload', c_ubyte),
+        ('Reserved2', c_ubyte * 6),
+    ]
+    def __new__(cls, buf):
+        # new instance from buf
+        return cls.from_buffer_copy(buf)
+
+    def __init__(self, data):
+        # claculate parameters
+        self.RangeAccuracy = self.RangeAccuracyIdx / 10000.0
+        self.DopplerAccuracy = self.DopplerAccuracyIdx / 10000.0
+        self.AzimuthAccuracy = self.AzimuthAccuracyIdx / 10000.0
+        self.ElevationAccuracy = self.ElevationAccuracyIdx / 10000.0
+
+
+
+class FooterBlock(Structure):
+    """
+    Footer structure, 32 bytes
+    """
+    _pack_ = 1
+    _fields_ = [
+        ('Reserved1', c_ubyte * 8),
+        ('RangeAccuracyIdx', c_uint16),         # divide by 10000 to get value in m
+        ('DopplerAccuracyIdx', c_uint16),       # divide by 10000 to get value in m
+        ('AzimuthAccuracyIdx', c_uint16),       # divide by 10000 to get value in degree
+        ('ElevationAccuracyIdx', c_uint16),     # divide by 10000 to get value in degree
+        ('Reserved2', c_ubyte * 16),
+    ]
+    def __new__(cls, buf):
+        # new instance from buf
+        return cls.from_buffer_copy(buf)
+
+    def __init__(self, data):
+        # claculate parameters
+        self.RangeAccuracy = self.RangeAccuracyIdx / 10000.0
+        self.DopplerAccuracy = self.DopplerAccuracyIdx / 10000.0
+        self.AzimuthAccuracy = self.AzimuthAccuracyIdx / 10000.0
+        self.ElevationAccuracy = self.ElevationAccuracyIdx / 10000.0
+
+
+class DetectionBlock:
+    """
+    Detection structure
+    using bitarray parse structure because of ctypes can't parse compact bitfields
+    """
+
+    def __init__(self, header: HeaderBlock, footer: FooterBlock, data):
+        buf = bytearray(data)
+        buf.reverse()
+        bits = bitarray()
+        bits.frombytes(bytes(buf))
+        # print(bits)
+        # parse data structure
+        self.Flag = bits[1]
+        self.RangeIndex = util.ba2int(bits[54:64])
+        self.DropplerIndex = util.ba2int(bits[45:54])
+        if bits[44]:
+            self.DropplerIndex -= 512
+        self.AzimuthIndex = util.ba2int(bits[35:44])
+        if bits[34]:
+            self.AzimuthIndex -= 512
+        self.BetaIndex = util.ba2int(bits[25:34])
+        if bits[24]:
+            self.BetaIndex -= 512
+        self.PowerValue = util.ba2int(bits[8:24])
+
+        if not self.Flag:
+            # using header's parameters
+            RangeAccuracy = header.RangeAccuracy
+            DopplerAccuracy = header.DopplerAccuracy
+            AzimuthAccuracy = header.AzimuthAccuracy
+            ElevationAccuracy = header.ElevationAccuracy
+        else:
+            # using footer's parameters
+            RangeAccuracy = footer.RangeAccuracy
+            DopplerAccuracy = footer.DopplerAccuracy
+            AzimuthAccuracy = footer.AzimuthAccuracy
+            ElevationAccuracy = footer.ElevationAccuracy
+
+        # claculation
+        self.Power = self.PowerValue / 100.0
+        self.Range = self.RangeIndex * RangeAccuracy
+        self.Doppler = self.DropplerIndex * DopplerAccuracy
+        self.Beta = self.BetaIndex * ElevationAccuracy
+        self.Azimuth = self.AzimuthIndex * AzimuthAccuracy
+        # degrees to radians
+        alpha = math.radians(self.Azimuth)
+        beta = math.radians(self.Beta)
+        # XYZ: The XYZ coordinates can be retrieved using the following equation:
+        # X = Range * Sin(Alpha) * Cos(Beta)
+        # Y = Range * Sin(Beta)
+        # Z = Range * Cos(Alpha) * Cos(Beta)
+        # or
+        # Z = sqrt(Range^2 - X^2 - Y^2)
+        self.X = self.Range * math.sin(alpha) * math.cos(beta)
+        self.Y = self.Range * math.sin(beta)
+        self.Z = math.sqrt(self.Range * self.Range -
+                           self.X * self.X - self.Y * self.Y)
+
+class TrackerBlock(Structure):
+    """
+    Tracker structure
+    """
+    _pack_ = 1
+    _fields_ = [
+        ('TrackID', c_uint32),      # 0 to 4294967296 Track ID
+        ('XPos', c_int16),          # -32768 to 32767, divide by 100 to get x in m (e.g. 6453 = 64.53 m, e.g.: -2456 = -24.56 m)
+        ('YPos', c_int16),          # -32768 to 32767, divide by 100 to get y in m (e.g. 6453 = 64.53 m, e.g. -2456 = -24.56 m)
+        ('ZPos', c_uint16),         # 0 to 65535, divide by 100 to get z in m (e.g. 12654 = 126.54 m)
+        ('XDot', c_int16),          # -32768 to 32767, divide by 100 to get speed in the x direction in m/s (e.g. 6453 = 64.53 m/s, e.g. -2456 = -24.56 m/s)
+        ('YDot', c_int16),          # -32768 to 32767, divide by 100 to get speed in the y direction in m/s (e.g. 6453 = 64.53 m/s, e.g. -2456 = -24.56 m/s)
+        ('ZDot', c_int16),          # -32768 to 32767, divide by 100 to get speed in the z direction in m/s (e.g. 6453 = 64.53 m/s, e.g. -2456 = -24.56 m/s)
+        ('Res1', c_uint16),
+        ('Res2', c_uint16),
+        ('Res3', c_uint16),
+        ('Flag', c_uint16),         # 0 to 65535. 16 1-bit flags, the flag definitions are internal to Oculii.
+                                    # Bit 3 鈥� Bit 15 : Reserved
+                                    # Bit 0, Bit 1, Bit 2 : Track Quality. Currently only values 1 and 2 are used. Filter to use only value 鈥�2鈥�.
+        ('Class', c_uint16),        # 0 to 5. Reserved for future.  
+                                    # 0: Unknown Class
+                                    # 1: Pedestrian
+                                    # 2: Motorcycle/Bike
+                                    # 3: Vehicle and SUV
+                                    # 4: Bus and Truck
+                                    # 5: Background
+        ('Conf', c_uint16),
+        ('Res4', c_uint16),
+        ('Res5', c_uint16),
+    ]
diff --git a/src/microwave/constants.py b/src/microwave/constants.py
new file mode 100644
index 0000000..8346fa5
--- /dev/null
+++ b/src/microwave/constants.py
@@ -0,0 +1,2 @@
+HAND_SHAKE_MAGIC = b"\x01\x09\x08\x09\x01\x00\x02\x02" 
+HEADER_MAGIC = b"\x02\x01\x04\x03\x06\x05\x08\x07" 
\ No newline at end of file
diff --git a/src/microwave/demo/AutoGetUDP.bat b/src/microwave/demo/AutoGetUDP.bat
new file mode 100644
index 0000000..9db842c
--- /dev/null
+++ b/src/microwave/demo/AutoGetUDP.bat
@@ -0,0 +1,22 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/../../../env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+
+echo All data will be save in '%cd%/saveUDPData/' folder
+
+%aerialpython% udp_test_get.py microwave
+
+echo =========== ALL DONE ================
+
+echo Press any key to exit this windiow.
+pause
diff --git a/src/microwave/demo/AutoGetUDPtest.bat b/src/microwave/demo/AutoGetUDPtest.bat
new file mode 100644
index 0000000..c8120ce
--- /dev/null
+++ b/src/microwave/demo/AutoGetUDPtest.bat
@@ -0,0 +1,22 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/../../../env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+
+echo All data will be saved in '%cd%/saveUDPData/' folder
+
+%aerialpython% udp_test_get.py test
+
+echo =========== ALL GET DONE ================
+
+echo Press any key to exit this windiow.
+pause
diff --git a/src/microwave/demo/AutoSendAndGetTest.bat b/src/microwave/demo/AutoSendAndGetTest.bat
new file mode 100644
index 0000000..73f4873
--- /dev/null
+++ b/src/microwave/demo/AutoSendAndGetTest.bat
@@ -0,0 +1,16 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/../../../env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+
+start AutoGetUDPtest.bat 
+start AutoSendUDPtest.bat
diff --git a/src/microwave/demo/AutoSendUDPtest.bat b/src/microwave/demo/AutoSendUDPtest.bat
new file mode 100644
index 0000000..f321d14
--- /dev/null
+++ b/src/microwave/demo/AutoSendUDPtest.bat
@@ -0,0 +1,22 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/../../../env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+
+echo All data saved in '%cd%/demoUDPData/' folder will be sent to 127.0.0.1:9911
+
+%aerialpython% udp_test_send.py
+
+echo =========== ALL SEND DONE ================
+
+echo Press any key to exit this windiow.
+pause
diff --git a/src/microwave/demo/MicroWave2Ply.py b/src/microwave/demo/MicroWave2Ply.py
new file mode 100644
index 0000000..7825244
--- /dev/null
+++ b/src/microwave/demo/MicroWave2Ply.py
@@ -0,0 +1,35 @@
+import os
+import sys
+
+# add python path of microwave to sys.path
+microwave_path = os.path.join(__file__, *(['..'] * 3))
+microwave_path = os.path.abspath(microwave_path)
+sys.path.insert(0, microwave_path)
+
+from microwave.parsers import MicroWaveParser
+
+if __name__ == '__main__':
+    if len(sys.argv) != 2:
+        print('Usage: python MicroWave2Ply.py [filename.bin]')
+        exit(1)
+
+    filename = sys.argv[1]
+    (fn, ext) = os.path.splitext(filename)
+    with open(filename, "rb") as udp_file:
+        buf = udp_file.read()
+        point_cloud = MicroWaveParser.ParserFrame(buf)
+        with open(fn + ".ply", "w") as f:
+            f.write("ply\n")
+            f.write("format ascii 1.0\n")
+            f.write("comment MicroWave2Ply generated\n")
+            f.write("element vertex %d\n" % len(point_cloud))
+            f.write("property float x\n")
+            f.write("property float y\n")
+            f.write("property float z\n")
+            f.write("element face 0\n")
+            f.write("property list uchar int vertex_indices\n")
+            f.write("end_header\n")
+            for p in point_cloud:
+                x, y, z = p
+                f.write("{:.5f} {:.5f} {:.5f}\n".format(x, y, z))
+            print("Done!")
diff --git a/src/microwave/demo/MicroWaveReceiverTest.py b/src/microwave/demo/MicroWaveReceiverTest.py
new file mode 100644
index 0000000..b7f8c21
--- /dev/null
+++ b/src/microwave/demo/MicroWaveReceiverTest.py
@@ -0,0 +1,31 @@
+import os
+from sys import argv
+import sys
+
+# add python path of microwave to sys.path
+microwave_path = os.path.join(__file__, *(['..'] * 3))
+microwave_path = os.path.abspath(microwave_path)
+sys.path.insert(0, microwave_path)
+
+from microwave.servers import MicroWaveReceiver
+
+
+if __name__ == '__main__':
+    if len(sys.argv) != 2:
+        print('Usage: python MicroWaveReceiverTest.py [folder]')
+        exit(1)
+    folder = sys.argv[1]
+    files = ["packet{}.udp".format(i) for i in range(100)]
+    receiver = MicroWaveReceiver()
+    for file in files:
+        filename = os.path.join(folder, file)
+        with open(filename, "rb") as f:
+            data = f.read()
+            receiver.AddBuf(data)
+            if receiver.DataFrameReady:
+                frame_number = receiver.Header.FrameNumber
+                bin_name = os.path.join(folder, "{}.bin".format(frame_number))
+                print("Frame {} ready".format(frame_number))
+                with open(bin_name, "wb") as bin_file:
+                    bin_file.write(receiver.DataFrame)
+                    bin_file.close()
diff --git a/src/microwave/demo/MicroWaveUDPServerTest.py b/src/microwave/demo/MicroWaveUDPServerTest.py
new file mode 100644
index 0000000..ddc2dd3
--- /dev/null
+++ b/src/microwave/demo/MicroWaveUDPServerTest.py
@@ -0,0 +1,57 @@
+import sys
+import time
+import os
+from socketserver import BaseRequestHandler, UDPServer
+
+# add python path of microwave to sys.path
+microwave_path = os.path.join(__file__, *(['..'] * 3))
+microwave_path = os.path.abspath(microwave_path)
+sys.path.insert(0, microwave_path)
+
+from microwave.servers import MicroWaveReceiver
+
+
+class MicroWaveRequestHandlertest(BaseRequestHandler):
+    def handle(self):
+        # Get message and client socket
+        buf, _ = self.request
+        receiver = self.server.Receiver
+        receiver.AddBuf(buf)
+        if receiver.DataFrameReady:
+            # data frame ready
+            frame_number = receiver.Header.FrameNumber
+            bin_name = os.path.join(self.server.OutputFolder, "{}.bin".format(frame_number))
+            print("Frame {} ready".format(frame_number))
+            with open(bin_name, "wb") as bin_file:
+                bin_file.write(receiver.DataFrame)
+
+
+class MicroWaveUDPServertest(UDPServer):
+    def __init__(self, server_address, output_folder):
+        super().__init__(server_address, MicroWaveRequestHandlertest)
+        # create receiver instance
+        self.Receiver = MicroWaveReceiver()
+        self.OutputFolder = output_folder
+
+if __name__ == '__main__':
+    if len(sys.argv) == 2:
+        output_folder = sys.argv[1]
+    else:
+        output_folder = '.'
+
+    # host = '192.168.2.65'
+    host = ''
+    port = 9911
+    server = MicroWaveUDPServertest((host, port), output_folder)
+    server.packed_count = 0
+    print(time.asctime(),'Server started on port', port)
+    print('....')
+    print('ctrl-c to quit server.')
+    try:
+        server.serve_forever()
+    except KeyboardInterrupt:
+        server.server_close()
+        print(time.asctime(),"Server Stopped")
+    except:
+        server.server_close()
+        print(time.asctime(),"Server Stopped")
\ No newline at end of file
diff --git a/src/microwave/demo/demoData/packet0.udp b/src/microwave/demo/demoData/packet0.udp
new file mode 100644
index 0000000..45ec6af
--- /dev/null
+++ b/src/microwave/demo/demoData/packet0.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet1.udp b/src/microwave/demo/demoData/packet1.udp
new file mode 100644
index 0000000..bdcd817
--- /dev/null
+++ b/src/microwave/demo/demoData/packet1.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet10.udp b/src/microwave/demo/demoData/packet10.udp
new file mode 100644
index 0000000..cbdae1b
--- /dev/null
+++ b/src/microwave/demo/demoData/packet10.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet11.udp b/src/microwave/demo/demoData/packet11.udp
new file mode 100644
index 0000000..47e9442
--- /dev/null
+++ b/src/microwave/demo/demoData/packet11.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet12.udp b/src/microwave/demo/demoData/packet12.udp
new file mode 100644
index 0000000..15ae507
--- /dev/null
+++ b/src/microwave/demo/demoData/packet12.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet13.udp b/src/microwave/demo/demoData/packet13.udp
new file mode 100644
index 0000000..c6b1347
--- /dev/null
+++ b/src/microwave/demo/demoData/packet13.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet14.udp b/src/microwave/demo/demoData/packet14.udp
new file mode 100644
index 0000000..276ad97
--- /dev/null
+++ b/src/microwave/demo/demoData/packet14.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet15.udp b/src/microwave/demo/demoData/packet15.udp
new file mode 100644
index 0000000..f1edce3
--- /dev/null
+++ b/src/microwave/demo/demoData/packet15.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet16.udp b/src/microwave/demo/demoData/packet16.udp
new file mode 100644
index 0000000..3ecac02
--- /dev/null
+++ b/src/microwave/demo/demoData/packet16.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet17.udp b/src/microwave/demo/demoData/packet17.udp
new file mode 100644
index 0000000..6c01a95
--- /dev/null
+++ b/src/microwave/demo/demoData/packet17.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet18.udp b/src/microwave/demo/demoData/packet18.udp
new file mode 100644
index 0000000..6f5d34b
--- /dev/null
+++ b/src/microwave/demo/demoData/packet18.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet19.udp b/src/microwave/demo/demoData/packet19.udp
new file mode 100644
index 0000000..979e72a
--- /dev/null
+++ b/src/microwave/demo/demoData/packet19.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet2.udp b/src/microwave/demo/demoData/packet2.udp
new file mode 100644
index 0000000..c1b9840
--- /dev/null
+++ b/src/microwave/demo/demoData/packet2.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet20.udp b/src/microwave/demo/demoData/packet20.udp
new file mode 100644
index 0000000..90b9361
--- /dev/null
+++ b/src/microwave/demo/demoData/packet20.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet21.udp b/src/microwave/demo/demoData/packet21.udp
new file mode 100644
index 0000000..1c42e28
--- /dev/null
+++ b/src/microwave/demo/demoData/packet21.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet22.udp b/src/microwave/demo/demoData/packet22.udp
new file mode 100644
index 0000000..144c58f
--- /dev/null
+++ b/src/microwave/demo/demoData/packet22.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet23.udp b/src/microwave/demo/demoData/packet23.udp
new file mode 100644
index 0000000..3955833
--- /dev/null
+++ b/src/microwave/demo/demoData/packet23.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet24.udp b/src/microwave/demo/demoData/packet24.udp
new file mode 100644
index 0000000..6ca2a5b
--- /dev/null
+++ b/src/microwave/demo/demoData/packet24.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet25.udp b/src/microwave/demo/demoData/packet25.udp
new file mode 100644
index 0000000..ba36f9e
--- /dev/null
+++ b/src/microwave/demo/demoData/packet25.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet26.udp b/src/microwave/demo/demoData/packet26.udp
new file mode 100644
index 0000000..e919a43
--- /dev/null
+++ b/src/microwave/demo/demoData/packet26.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet27.udp b/src/microwave/demo/demoData/packet27.udp
new file mode 100644
index 0000000..2075503
--- /dev/null
+++ b/src/microwave/demo/demoData/packet27.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet28.udp b/src/microwave/demo/demoData/packet28.udp
new file mode 100644
index 0000000..16544f4
--- /dev/null
+++ b/src/microwave/demo/demoData/packet28.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet29.udp b/src/microwave/demo/demoData/packet29.udp
new file mode 100644
index 0000000..dd261f7
--- /dev/null
+++ b/src/microwave/demo/demoData/packet29.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet3.udp b/src/microwave/demo/demoData/packet3.udp
new file mode 100644
index 0000000..4648123
--- /dev/null
+++ b/src/microwave/demo/demoData/packet3.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet30.udp b/src/microwave/demo/demoData/packet30.udp
new file mode 100644
index 0000000..b8179c4
--- /dev/null
+++ b/src/microwave/demo/demoData/packet30.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet31.udp b/src/microwave/demo/demoData/packet31.udp
new file mode 100644
index 0000000..9772cb9
--- /dev/null
+++ b/src/microwave/demo/demoData/packet31.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet32.udp b/src/microwave/demo/demoData/packet32.udp
new file mode 100644
index 0000000..c64b0af
--- /dev/null
+++ b/src/microwave/demo/demoData/packet32.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet33.udp b/src/microwave/demo/demoData/packet33.udp
new file mode 100644
index 0000000..702ac41
--- /dev/null
+++ b/src/microwave/demo/demoData/packet33.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet34.udp b/src/microwave/demo/demoData/packet34.udp
new file mode 100644
index 0000000..79dccdc
--- /dev/null
+++ b/src/microwave/demo/demoData/packet34.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet35.udp b/src/microwave/demo/demoData/packet35.udp
new file mode 100644
index 0000000..eab9861
--- /dev/null
+++ b/src/microwave/demo/demoData/packet35.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet36.udp b/src/microwave/demo/demoData/packet36.udp
new file mode 100644
index 0000000..9ac7d57
--- /dev/null
+++ b/src/microwave/demo/demoData/packet36.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet37.udp b/src/microwave/demo/demoData/packet37.udp
new file mode 100644
index 0000000..e851049
--- /dev/null
+++ b/src/microwave/demo/demoData/packet37.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet38.udp b/src/microwave/demo/demoData/packet38.udp
new file mode 100644
index 0000000..8f3f3de
--- /dev/null
+++ b/src/microwave/demo/demoData/packet38.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet39.udp b/src/microwave/demo/demoData/packet39.udp
new file mode 100644
index 0000000..218e0c0
--- /dev/null
+++ b/src/microwave/demo/demoData/packet39.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet4.udp b/src/microwave/demo/demoData/packet4.udp
new file mode 100644
index 0000000..8fbfa0e
--- /dev/null
+++ b/src/microwave/demo/demoData/packet4.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet40.udp b/src/microwave/demo/demoData/packet40.udp
new file mode 100644
index 0000000..30da04c
--- /dev/null
+++ b/src/microwave/demo/demoData/packet40.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet41.udp b/src/microwave/demo/demoData/packet41.udp
new file mode 100644
index 0000000..427cb47
--- /dev/null
+++ b/src/microwave/demo/demoData/packet41.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet42.udp b/src/microwave/demo/demoData/packet42.udp
new file mode 100644
index 0000000..580cebd
--- /dev/null
+++ b/src/microwave/demo/demoData/packet42.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet43.udp b/src/microwave/demo/demoData/packet43.udp
new file mode 100644
index 0000000..efbccb5
--- /dev/null
+++ b/src/microwave/demo/demoData/packet43.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet44.udp b/src/microwave/demo/demoData/packet44.udp
new file mode 100644
index 0000000..93722e8
--- /dev/null
+++ b/src/microwave/demo/demoData/packet44.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet45.udp b/src/microwave/demo/demoData/packet45.udp
new file mode 100644
index 0000000..ac7f7a1
--- /dev/null
+++ b/src/microwave/demo/demoData/packet45.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet46.udp b/src/microwave/demo/demoData/packet46.udp
new file mode 100644
index 0000000..7571a79
--- /dev/null
+++ b/src/microwave/demo/demoData/packet46.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet47.udp b/src/microwave/demo/demoData/packet47.udp
new file mode 100644
index 0000000..022174c
--- /dev/null
+++ b/src/microwave/demo/demoData/packet47.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet48.udp b/src/microwave/demo/demoData/packet48.udp
new file mode 100644
index 0000000..028df1f
--- /dev/null
+++ b/src/microwave/demo/demoData/packet48.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet49.udp b/src/microwave/demo/demoData/packet49.udp
new file mode 100644
index 0000000..fd55199
--- /dev/null
+++ b/src/microwave/demo/demoData/packet49.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet5.udp b/src/microwave/demo/demoData/packet5.udp
new file mode 100644
index 0000000..b1be8fa
--- /dev/null
+++ b/src/microwave/demo/demoData/packet5.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet50.udp b/src/microwave/demo/demoData/packet50.udp
new file mode 100644
index 0000000..63a569c
--- /dev/null
+++ b/src/microwave/demo/demoData/packet50.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet51.udp b/src/microwave/demo/demoData/packet51.udp
new file mode 100644
index 0000000..2592ed5
--- /dev/null
+++ b/src/microwave/demo/demoData/packet51.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet52.udp b/src/microwave/demo/demoData/packet52.udp
new file mode 100644
index 0000000..af91f8a
--- /dev/null
+++ b/src/microwave/demo/demoData/packet52.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet53.udp b/src/microwave/demo/demoData/packet53.udp
new file mode 100644
index 0000000..aa07cce
--- /dev/null
+++ b/src/microwave/demo/demoData/packet53.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet54.udp b/src/microwave/demo/demoData/packet54.udp
new file mode 100644
index 0000000..a3ecd0a
--- /dev/null
+++ b/src/microwave/demo/demoData/packet54.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet55.udp b/src/microwave/demo/demoData/packet55.udp
new file mode 100644
index 0000000..b02a1f3
--- /dev/null
+++ b/src/microwave/demo/demoData/packet55.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet56.udp b/src/microwave/demo/demoData/packet56.udp
new file mode 100644
index 0000000..94ab22f
--- /dev/null
+++ b/src/microwave/demo/demoData/packet56.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet57.udp b/src/microwave/demo/demoData/packet57.udp
new file mode 100644
index 0000000..8f7132c
--- /dev/null
+++ b/src/microwave/demo/demoData/packet57.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet58.udp b/src/microwave/demo/demoData/packet58.udp
new file mode 100644
index 0000000..b78bcd5
--- /dev/null
+++ b/src/microwave/demo/demoData/packet58.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet59.udp b/src/microwave/demo/demoData/packet59.udp
new file mode 100644
index 0000000..c91c8a7
--- /dev/null
+++ b/src/microwave/demo/demoData/packet59.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet6.udp b/src/microwave/demo/demoData/packet6.udp
new file mode 100644
index 0000000..fde0113
--- /dev/null
+++ b/src/microwave/demo/demoData/packet6.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet60.udp b/src/microwave/demo/demoData/packet60.udp
new file mode 100644
index 0000000..2f5012a
--- /dev/null
+++ b/src/microwave/demo/demoData/packet60.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet61.udp b/src/microwave/demo/demoData/packet61.udp
new file mode 100644
index 0000000..efb3fd9
--- /dev/null
+++ b/src/microwave/demo/demoData/packet61.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet62.udp b/src/microwave/demo/demoData/packet62.udp
new file mode 100644
index 0000000..1dc13e5
--- /dev/null
+++ b/src/microwave/demo/demoData/packet62.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet63.udp b/src/microwave/demo/demoData/packet63.udp
new file mode 100644
index 0000000..39fb456
--- /dev/null
+++ b/src/microwave/demo/demoData/packet63.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet64.udp b/src/microwave/demo/demoData/packet64.udp
new file mode 100644
index 0000000..2b31395
--- /dev/null
+++ b/src/microwave/demo/demoData/packet64.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet65.udp b/src/microwave/demo/demoData/packet65.udp
new file mode 100644
index 0000000..cc20dd3
--- /dev/null
+++ b/src/microwave/demo/demoData/packet65.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet66.udp b/src/microwave/demo/demoData/packet66.udp
new file mode 100644
index 0000000..cc9834a
--- /dev/null
+++ b/src/microwave/demo/demoData/packet66.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet67.udp b/src/microwave/demo/demoData/packet67.udp
new file mode 100644
index 0000000..7bd1728
--- /dev/null
+++ b/src/microwave/demo/demoData/packet67.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet68.udp b/src/microwave/demo/demoData/packet68.udp
new file mode 100644
index 0000000..cbdae1b
--- /dev/null
+++ b/src/microwave/demo/demoData/packet68.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet69.udp b/src/microwave/demo/demoData/packet69.udp
new file mode 100644
index 0000000..09bbe10
--- /dev/null
+++ b/src/microwave/demo/demoData/packet69.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet7.udp b/src/microwave/demo/demoData/packet7.udp
new file mode 100644
index 0000000..f39b222
--- /dev/null
+++ b/src/microwave/demo/demoData/packet7.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet70.udp b/src/microwave/demo/demoData/packet70.udp
new file mode 100644
index 0000000..f0f22f1
--- /dev/null
+++ b/src/microwave/demo/demoData/packet70.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet71.udp b/src/microwave/demo/demoData/packet71.udp
new file mode 100644
index 0000000..4a6e31c
--- /dev/null
+++ b/src/microwave/demo/demoData/packet71.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet72.udp b/src/microwave/demo/demoData/packet72.udp
new file mode 100644
index 0000000..6aa2d01
--- /dev/null
+++ b/src/microwave/demo/demoData/packet72.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet73.udp b/src/microwave/demo/demoData/packet73.udp
new file mode 100644
index 0000000..ef5e1e2
--- /dev/null
+++ b/src/microwave/demo/demoData/packet73.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet74.udp b/src/microwave/demo/demoData/packet74.udp
new file mode 100644
index 0000000..abad527
--- /dev/null
+++ b/src/microwave/demo/demoData/packet74.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet75.udp b/src/microwave/demo/demoData/packet75.udp
new file mode 100644
index 0000000..84cf797
--- /dev/null
+++ b/src/microwave/demo/demoData/packet75.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet76.udp b/src/microwave/demo/demoData/packet76.udp
new file mode 100644
index 0000000..88b736a
--- /dev/null
+++ b/src/microwave/demo/demoData/packet76.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet77.udp b/src/microwave/demo/demoData/packet77.udp
new file mode 100644
index 0000000..0b3ff02
--- /dev/null
+++ b/src/microwave/demo/demoData/packet77.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet78.udp b/src/microwave/demo/demoData/packet78.udp
new file mode 100644
index 0000000..1be3d16
--- /dev/null
+++ b/src/microwave/demo/demoData/packet78.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet79.udp b/src/microwave/demo/demoData/packet79.udp
new file mode 100644
index 0000000..78066c9
--- /dev/null
+++ b/src/microwave/demo/demoData/packet79.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet8.udp b/src/microwave/demo/demoData/packet8.udp
new file mode 100644
index 0000000..e253b20
--- /dev/null
+++ b/src/microwave/demo/demoData/packet8.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet80.udp b/src/microwave/demo/demoData/packet80.udp
new file mode 100644
index 0000000..ac896f2
--- /dev/null
+++ b/src/microwave/demo/demoData/packet80.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet81.udp b/src/microwave/demo/demoData/packet81.udp
new file mode 100644
index 0000000..2b31395
--- /dev/null
+++ b/src/microwave/demo/demoData/packet81.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet82.udp b/src/microwave/demo/demoData/packet82.udp
new file mode 100644
index 0000000..81c14a1
--- /dev/null
+++ b/src/microwave/demo/demoData/packet82.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet83.udp b/src/microwave/demo/demoData/packet83.udp
new file mode 100644
index 0000000..c8a9c4d
--- /dev/null
+++ b/src/microwave/demo/demoData/packet83.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet84.udp b/src/microwave/demo/demoData/packet84.udp
new file mode 100644
index 0000000..7fa678f
--- /dev/null
+++ b/src/microwave/demo/demoData/packet84.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet85.udp b/src/microwave/demo/demoData/packet85.udp
new file mode 100644
index 0000000..a0ec621
--- /dev/null
+++ b/src/microwave/demo/demoData/packet85.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet86.udp b/src/microwave/demo/demoData/packet86.udp
new file mode 100644
index 0000000..9c707b5
--- /dev/null
+++ b/src/microwave/demo/demoData/packet86.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet87.udp b/src/microwave/demo/demoData/packet87.udp
new file mode 100644
index 0000000..8d608a5
--- /dev/null
+++ b/src/microwave/demo/demoData/packet87.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet88.udp b/src/microwave/demo/demoData/packet88.udp
new file mode 100644
index 0000000..db31558
--- /dev/null
+++ b/src/microwave/demo/demoData/packet88.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet89.udp b/src/microwave/demo/demoData/packet89.udp
new file mode 100644
index 0000000..1077acf
--- /dev/null
+++ b/src/microwave/demo/demoData/packet89.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet9.udp b/src/microwave/demo/demoData/packet9.udp
new file mode 100644
index 0000000..411ee5c
--- /dev/null
+++ b/src/microwave/demo/demoData/packet9.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet90.udp b/src/microwave/demo/demoData/packet90.udp
new file mode 100644
index 0000000..68a44a8
--- /dev/null
+++ b/src/microwave/demo/demoData/packet90.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet91.udp b/src/microwave/demo/demoData/packet91.udp
new file mode 100644
index 0000000..aa7fac1
--- /dev/null
+++ b/src/microwave/demo/demoData/packet91.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet92.udp b/src/microwave/demo/demoData/packet92.udp
new file mode 100644
index 0000000..5d4b12f
--- /dev/null
+++ b/src/microwave/demo/demoData/packet92.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet93.udp b/src/microwave/demo/demoData/packet93.udp
new file mode 100644
index 0000000..273e0bf
--- /dev/null
+++ b/src/microwave/demo/demoData/packet93.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet94.udp b/src/microwave/demo/demoData/packet94.udp
new file mode 100644
index 0000000..c519c4e
--- /dev/null
+++ b/src/microwave/demo/demoData/packet94.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet95.udp b/src/microwave/demo/demoData/packet95.udp
new file mode 100644
index 0000000..f72c0fb
--- /dev/null
+++ b/src/microwave/demo/demoData/packet95.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet96.udp b/src/microwave/demo/demoData/packet96.udp
new file mode 100644
index 0000000..a7614ef
--- /dev/null
+++ b/src/microwave/demo/demoData/packet96.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet97.udp b/src/microwave/demo/demoData/packet97.udp
new file mode 100644
index 0000000..cd53dd6
--- /dev/null
+++ b/src/microwave/demo/demoData/packet97.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet98.udp b/src/microwave/demo/demoData/packet98.udp
new file mode 100644
index 0000000..427d702
--- /dev/null
+++ b/src/microwave/demo/demoData/packet98.udp
Binary files differ
diff --git a/src/microwave/demo/demoData/packet99.udp b/src/microwave/demo/demoData/packet99.udp
new file mode 100644
index 0000000..6ccc285
--- /dev/null
+++ b/src/microwave/demo/demoData/packet99.udp
Binary files differ
diff --git a/src/microwave/demo/polty.ipynb b/src/microwave/demo/polty.ipynb
new file mode 100644
index 0000000..8cd999e
--- /dev/null
+++ b/src/microwave/demo/polty.ipynb
@@ -0,0 +1,64 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[Open3D WARNING] [ViewControl] SetViewPoint() failed because window height and width are not set.\n"
+     ]
+    }
+   ],
+   "source": [
+    "import open3d as o3d\n",
+    "# visualization of point clouds.\n",
+    "# pcd = o3d.io.read_point_cloud('dense2_without_color.ply')\n",
+    "# show = [pcd]\n",
+    "pcd2522 = o3d.io.read_point_cloud('demoData/2522.ply')\n",
+    "pcd2523 = o3d.io.read_point_cloud('demoData2523.ply')\n",
+    "pcd2524 = o3d.io.read_point_cloud('demoData2524.ply')\n",
+    "pcd2525 = o3d.io.read_point_cloud('demoData2525.ply')\n",
+    "pcd2526 = o3d.io.read_point_cloud('demoData2526.ply')\n",
+    "pcd2527 = o3d.io.read_point_cloud('demoData2527.ply')\n",
+    "show = [pcd2522,pcd2523,pcd2524,pcd2525,pcd2526,pcd2527]\n",
+    "o3d.visualization.draw_geometries(show)\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "interpreter": {
+   "hash": "35e65690039548a4ed71bb11d5d15cea8607c9411f67738c48033f1deba4df50"
+  },
+  "kernelspec": {
+   "display_name": "Python 3.9.10 ('huaneng_server')",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.10"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/src/microwave/demo/udp_test_get.py b/src/microwave/demo/udp_test_get.py
new file mode 100644
index 0000000..c5bc283
--- /dev/null
+++ b/src/microwave/demo/udp_test_get.py
@@ -0,0 +1,63 @@
+from socketserver import BaseRequestHandler, UDPServer
+import time
+import os, sys
+
+
+cudir,_ = os.path.split(__file__)
+file_folder = os.path.join(cudir,"saveUDPData")
+
+if not os.path.exists(file_folder):
+    os.makedirs(file_folder)
+    print(f"make a new folder: {file_folder}")
+
+packed_count = 0
+
+class PointCloudUDPRequestHandler(BaseRequestHandler):
+
+    def handle(self):
+
+        global packed_count
+
+        print(time.asctime(),' Got connection from {}, {}'.format(self.client_address, packed_count))
+        # Get message and client socket
+        msg, sock = self.request
+        f = open('{}/packet{}.udp'.format(file_folder,packed_count), 'wb')
+        f.write(msg)
+        f.close()
+        packed_count += 1
+        if packed_count >= 1000000:
+            UDPServer.server_close(server)
+
+
+if __name__ == '__main__':
+
+    def help():
+        print("Usage: udp_test_get.py [host]. host can be 'test' or 'microwave' ")
+        exit(1)
+
+    if len(sys.argv) == 2:
+        if sys.argv[1] == 'test':
+            host = ''
+        elif sys.argv[1] == 'microwave':
+            host = '192.168.2.65'
+        else:
+            help()
+    else:
+        help()
+
+    global server
+    # host = ''
+    # host = '192.168.2.65' # use this host to get the udp data from microwave device
+    port = 9911
+    server =UDPServer((host, port), PointCloudUDPRequestHandler)
+    print(time.asctime(),'Server started on port', port)
+    print('....')
+    print('ctrl-c to quit server.')
+    try:
+        server.serve_forever()
+    except KeyboardInterrupt:
+        server.server_close()
+        print(time.asctime(),"Server Stopped")
+    except:
+        server.server_close()
+        print(time.asctime(),"Server Stopped")
\ No newline at end of file
diff --git a/src/microwave/demo/udp_test_send.py b/src/microwave/demo/udp_test_send.py
new file mode 100644
index 0000000..d23f81a
--- /dev/null
+++ b/src/microwave/demo/udp_test_send.py
@@ -0,0 +1,21 @@
+import time
+import socket
+import os, sys
+
+cudir,_ = os.path.split(__file__)
+file_folder = os.path.join(cudir,"demoData")
+
+packed_count = 0
+if __name__ == '__main__':
+
+    files = ["packet{}.udp".format(i) for i in range(0, 100)]
+    for file in files:
+        with open(os.path.join(file_folder,file), "rb") as f:
+            message = f.read()
+            client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+            client_socket.settimeout(1.0)
+            addr = ("127.0.0.1", 9911)
+            client_socket.sendto(message, addr)
+            print (time.asctime(), f' Sending {file} to {addr} ...')
+            time.sleep(0.1)
+    print('Done!')
diff --git a/src/microwave/parsers.py b/src/microwave/parsers.py
new file mode 100644
index 0000000..97c0b07
--- /dev/null
+++ b/src/microwave/parsers.py
@@ -0,0 +1,23 @@
+from .components import *
+from .constants import *
+from ctypes import sizeof, string_at
+
+
+
+class MicroWaveParser:
+    @classmethod
+    def ParserFrame(cls, buffer: bytes) -> list:
+        """
+        瑙f瀽瀹屾暣鐨勪竴甯ф暟鎹紝鏁版嵁鍖呮嫭鏁版嵁澶达紝鏁版嵁浣擄紝鏁版嵁灏撅紝杩斿洖鐐逛簯鏁扮粍
+        """
+        header = HeaderBlock(buffer[:sizeof(HeaderBlock)])
+        if HEADER_MAGIC == string_at(header.Magic, 8):
+            footer = FooterBlock(buffer[-sizeof(FooterBlock):])
+            point_cloud = []
+            for i in range(header.NumberOfDetection):
+                detection = DetectionBlock(header, footer, buffer[i * 8 + sizeof(HeaderBlock): (i + 1) * 8 + sizeof(HeaderBlock)])
+                point = (detection.X, detection.Y, detection.Z)
+                point_cloud.append(point)
+            return point_cloud
+        else:
+            return []
\ No newline at end of file
diff --git a/src/microwave/servers.py b/src/microwave/servers.py
new file mode 100644
index 0000000..e9c315b
--- /dev/null
+++ b/src/microwave/servers.py
@@ -0,0 +1,146 @@
+import os, sys
+from ctypes import sizeof, string_at
+from socketserver import BaseRequestHandler, UDPServer
+from .components import *
+from .constants import *
+
+# add python path of src to sys.path
+src_path = os.path.join(__file__, *(['..'] * 2))
+src_path = os.path.abspath(src_path)
+sys.path.insert(0, src_path)
+
+from protos import aerial_pb2 as pb
+
+
+
+UDP_STATE_IDLE = 0
+UDP_STATE_HAND_SHAKE = 1
+UDP_STATE_DATA = 2
+UDP_STATE_FOOTER  = 3
+
+class MicroWaveReceiver:
+    """
+    micro wave data receiver
+    use AddBuf method add udp packet to receiver
+    when DataFrameReady == True, you can get data frame
+    """
+    def __init__(self):
+        self.state = UDP_STATE_IDLE
+        self.PointCount = 0
+        self.TrackCount = 0
+        self.DataFrameReady = False
+        self.DataFrame = None 
+        self.Header = None
+        self.Footer = None
+    
+    def _receive_data(self, data) -> None:
+        """
+        receive data packet from udp
+        """
+        self.data_buf.extend(data)
+        self.ReceivedDataLength += len(data)
+        if self.ReceivedDataLength == self.DataLength:
+            # if received data length equal expected data length
+            # then we can get footer block
+            self.state = UDP_STATE_FOOTER
+        return
+
+    def _receive_footer(self, data) -> None:
+        # receive footer block
+        self.footer_buf.extend(data)
+        self.ReceivedFooterLength += len(data)
+        if self.ReceivedFooterLength == sizeof(FooterBlock):
+            self.Footer = FooterBlock.from_buffer_copy(self.footer_buf)
+            # after received footer block, the data frame is ready
+            self.DataFrameReady = True
+            # reset state to idle, ready for next data frame
+            self.state = UDP_STATE_IDLE
+        return
+    
+    def AddBuf(self, buf: bytes) -> None:
+        # add a udp packet to receiver
+        buf_size = len(buf)
+        if self.state == UDP_STATE_IDLE:
+            if buf_size == sizeof(Handshake):
+                handshake = Handshake.from_buffer_copy(buf)
+                if HAND_SHAKE_MAGIC == string_at(handshake.Magic, 8):
+                    self.DataFrameReady = False
+                    self.state = UDP_STATE_HAND_SHAKE
+                    self.DataFrame = None
+                    self.Header = None
+                    self.Footer = None
+        elif self.state == UDP_STATE_HAND_SHAKE:
+            # after received handshake packet, we can get header block 
+            self.Header = HeaderBlock.from_buffer_copy(buf[:sizeof(HeaderBlock)])
+            if HEADER_MAGIC == string_at(self.Header.Magic, 8):
+                self.DataFrame = bytearray(buf)
+                N = self.Header.NumberOfDetection
+                Nt = self.Header.NumberOfTrack
+                self.PointCount = 0
+                self.TrackCount = 0
+                self.DataLength = N * 8 + Nt * sizeof(TrackerBlock)
+                self.RemainLength = self.DataLength + sizeof(FooterBlock)
+                self.data_buf = bytearray()
+                self.footer_buf = bytearray()
+                self.Points = []
+                self.ReceivedDataLength = 0
+                self.ReceivedFooterLength = 0
+                # the next packet should be data block
+                self.state = UDP_STATE_DATA
+
+                header_size = sizeof(HeaderBlock)
+                # 澶勭悊绗竴涓暟鎹寘涓殑鏁版嵁
+                data_size = min(buf_size - header_size, self.DataLength)
+                self._receive_data(buf[header_size: header_size + data_size])
+                
+                # 鍒ゆ柇绗竴涓暟鎹寘涓槸鍚﹀寘鍚獸ooter Block
+                if (header_size + data_size) < buf_size:
+                    self._receive_footer(buf[header_size + data_size])
+        elif self.state == UDP_STATE_DATA:
+            # receive data block
+            self.DataFrame.extend(buf)
+            remain_data_size = self.DataLength - self.ReceivedDataLength
+            data_size = min(buf_size, remain_data_size)
+            self._receive_data(buf[: data_size])
+            if data_size < buf_size:
+                self._receive_footer(buf[data_size: ])
+        elif self.state == UDP_STATE_FOOTER:
+            # receive footer block
+            self.DataFrame.extend(buf)
+            self._receive_footer(buf)
+
+
+
+class MicroWaveRequestHandler(BaseRequestHandler):
+    """
+    micro wave udp request handler
+    """
+    def handle(self):
+        # Get message and client socket
+        buf, _ = self.request
+        receiver = self.server.Receiver
+        # add buffer to receiver
+        receiver.AddBuf(buf)
+        if receiver.DataFrameReady:
+            # dataframe ready, add to udp_queue
+            msg = pb.RequestCommand()
+            msg.sys_command = pb.SysCommand.MICRO_WAVE_COMMAND
+            msg.sub_command = pb.SubCommand.MICRO_WAVE_SUB_COMMAND
+            data1 = pb.MicroWaveMessage()
+            data1.length = len(receiver.DataFrame)
+            data1.data = bytes(receiver.DataFrame)
+            data1_str = data1.SerializeToString()
+            msg.data1.length = len(data1_str)
+            msg.data1.data = data1_str
+            self.server.msg_queue.put(msg)
+
+
+class MicroWaveUDPServer(UDPServer):
+    """
+    micro wave udp server
+    """
+    def __init__(self, server_address, msg_queue):
+        super().__init__(server_address, MicroWaveRequestHandler)
+        # create receiver instance
+        self.Receiver = MicroWaveReceiver()
+        self.msg_queue = msg_queue
\ No newline at end of file
diff --git a/src/utils/__init__.py b/src/utils/__init__.py
new file mode 100644
index 0000000..6ac1ccc
--- /dev/null
+++ b/src/utils/__init__.py
@@ -0,0 +1 @@
+from .tools import *
\ No newline at end of file
diff --git a/src/utils/bin2ply.py b/src/utils/bin2ply.py
new file mode 100644
index 0000000..38b12ba
--- /dev/null
+++ b/src/utils/bin2ply.py
@@ -0,0 +1,54 @@
+import os
+import sys
+import time
+
+# add python path of src to sys.path
+src_path = os.path.join(__file__, *(['..'] * 2))
+src_path = os.path.abspath(src_path)
+sys.path.insert(0, src_path)
+
+from microwave.parsers import MicroWaveParser
+from tools import file_fliter
+
+if __name__ == "__main__":
+    def help():
+        print("Usage: bin2ply.py [BINfolder]")
+        print("EXAMPLE: BIN2ply.py ./manual_ply/pod1-2012-12-12-12-12-12/")
+        exit(1)
+
+    if len(sys.argv) != 2:
+        help()
+    try:
+        BINfolder = str(sys.argv[1])
+        # example pod1-2022-02-21-13-25-03_packet125.udp --> 125
+        sort_lambda = lambda x:int(x.split('.')[0])
+        bin_files = file_fliter(BINfolder,'bin', sort_lambda)
+
+    except Exception as e:
+        print(e)
+        help()
+    
+    for file in bin_files:
+
+        filename = file
+        (fn, ext) = os.path.splitext(filename)
+        with open(os.path.join(BINfolder,file), "rb") as bin_file:
+            buf = bin_file.read()
+            point_cloud = MicroWaveParser.ParserFrame(buf)
+            with open(os.path.join(BINfolder,fn +".ply"), "w") as f:
+                f.write("ply\n")
+                f.write("format ascii 1.0\n")
+                f.write("comment MicroWave2Ply generated\n")
+                f.write("element vertex %d\n" % len(point_cloud))
+                f.write("property float x\n")
+                f.write("property float y\n")
+                f.write("property float z\n")
+                f.write("element face 0\n")
+                f.write("property list uchar int vertex_indices\n")
+                f.write("end_header\n")
+                n_p = 0
+                for p in point_cloud:
+                    x, y, z = p
+                    f.write("{:.5f} {:.5f} {:.5f}\n".format(x, y, z))
+                    n_p += 1
+                print(time.asctime(),f"Frame {fn}.ply have been saved with {n_p} points!")
\ No newline at end of file
diff --git a/src/utils/plot_ply.py b/src/utils/plot_ply.py
new file mode 100644
index 0000000..855395a
--- /dev/null
+++ b/src/utils/plot_ply.py
@@ -0,0 +1,23 @@
+import open3d as o3d
+import sys
+
+if __name__ == "__main__":
+    def help():
+        print("Usage: plot_ply.py [PLYfile]")
+        print("EXAMPLE: plot_ply ./Manual_Microwave/pod1-2022-02-21-15-34-45/2522.ply")
+        exit(1)
+
+    if len(sys.argv) != 2:
+        help()
+    try:
+        PLYfile = str(sys.argv[1])
+
+        pcd = o3d.io.read_point_cloud(PLYfile)
+
+    except Exception as e:
+        print(e)
+        help()
+    
+    show = [pcd]
+
+    o3d.visualization.draw_geometries(show)
\ No newline at end of file
diff --git a/src/utils/tools.py b/src/utils/tools.py
new file mode 100644
index 0000000..90adc7c
--- /dev/null
+++ b/src/utils/tools.py
@@ -0,0 +1,17 @@
+import os, sys
+
+def file_fliter(folder:str, file_ext:str, sort_format):
+
+    files_List = os.listdir(folder)
+    target_files = []
+
+    # flitered by file extention name
+    for file in files_List:
+        if file.split('.')[-1] == file_ext:
+            target_files.append(file)
+    # sort the list by the sort_format
+    target_files.sort(key=sort_format)
+
+    return target_files
+    
+
diff --git a/src/utils/udp2bin.py b/src/utils/udp2bin.py
new file mode 100644
index 0000000..be2250f
--- /dev/null
+++ b/src/utils/udp2bin.py
@@ -0,0 +1,46 @@
+import os
+from sys import argv
+import sys
+import time
+
+# add python path of src to sys.path
+src_path = os.path.join(__file__, *(['..'] * 2))
+src_path = os.path.abspath(src_path)
+sys.path.insert(0, src_path)
+
+from microwave.servers import MicroWaveReceiver
+from tools import file_fliter
+
+
+if __name__ == '__main__':
+
+    def help():
+        print("Usage: udp2bin.py [UDPfolder]")
+        print("EXAMPLE: udp2bin.py ./manual_ply/pod1-2012-12-12-12-12-12/")
+        exit(1)
+
+    if len(sys.argv) != 2:
+        help()
+    try:
+        UDPfolder = str(sys.argv[1])
+        # example pod1-2022-02-21-13-25-03_packet125.udp --> 125
+        sort_lambda = lambda x:int(x.split('packet')[1][:-4])
+        udp_files = file_fliter(UDPfolder,'udp', sort_lambda)
+
+    except Exception as e:
+        print(e)
+        help()
+
+    receiver = MicroWaveReceiver()
+    for file in udp_files:
+        filename = os.path.join(UDPfolder, file)
+        with open(filename, "rb") as f:
+            data = f.read()
+            receiver.AddBuf(data)
+            if receiver.DataFrameReady:
+                frame_number = receiver.Header.FrameNumber
+                bin_name = os.path.join(UDPfolder, "{}.bin".format(frame_number))
+                print(time.asctime(),"Frame {} ready".format(frame_number))
+                with open(bin_name, "wb") as bin_file:
+                    bin_file.write(receiver.DataFrame)
+                    bin_file.close()
\ No newline at end of file
diff --git a/src/utils/udp_get.py b/src/utils/udp_get.py
new file mode 100644
index 0000000..a34d386
--- /dev/null
+++ b/src/utils/udp_get.py
@@ -0,0 +1,88 @@
+import datetime
+from pickle import GLOBAL
+from socketserver import BaseRequestHandler, UDPServer
+import time
+import os, sys
+
+
+# cudir,_ = os.path.split(__file__)
+# file_folder = os.path.join(cudir,"saveUDPData")
+
+# if not os.path.exists(file_folder):
+#     os.makedirs(file_folder)
+#     print(f"make a new folder: {file_folder}")
+
+packed_count = 0
+
+class PointCloudUDPRequestHandler(BaseRequestHandler):
+
+    def handle(self):
+
+        global packed_count
+        global path
+
+        if packed_count == 0:
+            start = datetime.datetime.now()
+            if not os.path.exists(save_folder):
+                os.mkdir(save_folder)
+            path = os.path.join(save_folder,f"{device_id}-{start.strftime('%Y-%m-%d-%H-%M-%S')}")
+            if not os.path.exists(path):
+                os.mkdir(path)
+            path = os.path.abspath(path)
+
+        print(time.asctime(),' Got connection from {}, {}'.format(self.client_address, packed_count))
+        # Get message and client socket
+        msg, sock = self.request
+        time_tag = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
+        f = open('{}/{}_packet{}.udp'.format(path,time_tag,packed_count), 'wb')
+        f.write(msg)
+        f.close()
+        packed_count += 1
+        
+        if packed_count >= packet_threshold:
+            UDPServer.server_close(server)
+
+
+if __name__ == '__main__':
+
+    def help():
+        print("Usage: udp_get.py [MICROWAVEhost] [PACKETthreshold] [DEVICEname] [SAVEfolder]")
+        print("EXAMPLE: udp_get.py 192.168.2.65 1000 pod1 ./manual_ply")
+        exit(1)
+
+    if len(sys.argv) != 5:
+        help()
+    try:
+        MICROWAVEhost = str(sys.argv[1])
+        PACKETthreshold = int(sys.argv[2])
+        DEVICEname = str(sys.argv[3])
+        SAVEfolder = str(sys.argv[4])
+
+        global packet_threshold
+        packet_threshold = PACKETthreshold
+        global device_id
+        device_id = DEVICEname
+        global save_folder
+        save_folder = SAVEfolder
+
+    except Exception as e:
+        print(e)
+        help()
+
+    global server
+    
+    # host = ''
+    # host = '192.168.2.65' # use this host to get the udp data from microwave device
+    port = 9911
+    server =UDPServer((MICROWAVEhost, port), PointCloudUDPRequestHandler)
+    print(time.asctime(),'Server started on port', port)
+    print('....')
+    print('ctrl-c to quit server.')
+    try:
+        server.serve_forever()
+    except KeyboardInterrupt:
+        server.server_close()
+        print(time.asctime(),"Server Stopped")
+    except:
+        server.server_close()
+        print(time.asctime(),"Server Stopped")
\ No newline at end of file
diff --git a/startClient.bat b/startClient.bat
index 87ded5b..e4b047a 100644
--- a/startClient.bat
+++ b/startClient.bat
@@ -9,8 +9,24 @@
 
 @REM Setting the env
 if not exist %aerialpython% (
-    %envsetting% 
+    call %envsetting% 
 )
+cd %~dp0
+echo change to path: %cd%
+
+set MQhost=172.17.17.206
+set MQuser=chai
+set MQpassword=password123
+set QUEUEname=aerial_rpc
+set DEVICEname=pod1
+set SERVERhost=http://172.17.17.206/api
+set MICROWAVEhost=192.168.2.65
+set LOGfile=Client.log
 
 @REM Launch the Client
-%aerialpython% ./src/Client.py
+echo the log file will be saved in the [%LOGfile%] file
+echo Client.py is running ...
+@REM -------- Usage: Client.py [MQhost] [MQuser] [MQpassword] [QUEUEname] [DEVICEname] [SERVERhost] [MICROWAVEhost]
+%aerialpython% ./src/Client.py %MQhost% %MQuser% %MQpassword% %QUEUEname% %DEVICEname% %SERVERhost% %MICROWAVEhost% >> %LOGfile%
+echo Client.py has been terminited.
+pause 
diff --git a/startServer.bat b/startServer.bat
index 49b8ce6..95d0c07 100644
--- a/startServer.bat
+++ b/startServer.bat
@@ -9,8 +9,24 @@
 
 @REM Setting the env
 if not exist %aerialpython% (
-    %envsetting% 
+    call %envsetting% 
 )
+cd %~dp0
+echo change to path: %cd%
+
+set MQhost=172.17.17.206
+set MQuser=chai
+set MQpassword=password123
+set QUEUEname=aerial_rpc
+set WEBport=5000
+set SAVEfolder=./Images
+set LOGfile=Server.log
 
 @REM Launch the Server
-%aerialpython% ./src/Server.py
+echo the log file will be saved in the [%LOGfile%] file
+echo Server.py is running ...
+@REM -------- Usage: Server.py [MQhost] [MQuser] [MQpassword] [QUEUEname] [WEBport] [SAVEfolder]")
+%aerialpython% ./src/Server.py %MQhost% %MQuser% %MQpassword% %QUEUEname% %WEBport% %SAVEfolder% >> >> %LOGfile%
+echo Server.py has been terminited.
+pause
+
diff --git a/udp2bin.bat b/udp2bin.bat
new file mode 100644
index 0000000..f7efa92
--- /dev/null
+++ b/udp2bin.bat
@@ -0,0 +1,23 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+
+cd %~dp0
+echo change to path: %cd%
+
+@REM please the folder path of the udp files.
+@REM set UDPfolder=./Manual_Microwave/pod1-2012-12-12-12-12-12/
+
+@REM ---------------Usage: udp2bin.py [UDPfolder]
+%aerialpython% ./src/utils/udp2bin.py %UDPfolder%
+pause
\ No newline at end of file
diff --git a/udp2ply.bat b/udp2ply.bat
new file mode 100644
index 0000000..50f393e
--- /dev/null
+++ b/udp2ply.bat
@@ -0,0 +1,25 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+
+cd %~dp0
+echo change to path: %cd%
+
+@REM please the folder path of the udp files.
+@REM set UDPfolder=./Manual_Microwave/pod1-2012-12-12-12-12-12/
+
+@REM ---------------Usage: udp2bin.py [UDPfolder]
+%aerialpython% ./src/utils/udp2bin.py %UDPfolder%
+@REM ---------------Usage: bin2ply.py [BINfolder]
+%aerialpython% ./src/utils/bin2ply.py %UDPfolder%
+pause
\ No newline at end of file
diff --git a/udp_get.bat b/udp_get.bat
new file mode 100644
index 0000000..363fa14
--- /dev/null
+++ b/udp_get.bat
@@ -0,0 +1,23 @@
+@echo off
+
+@REM change to the filepath
+cd %~dp0
+echo change to path: %cd%
+
+set aerialpython=%cd%/env/aerial_deploy/python.exe
+set envsetting=%cd%/env/SettingEnv.bat
+
+@REM Setting the env
+if not exist %aerialpython% (
+    call %envsetting% 
+)
+cd %~dp0
+echo change to path: %cd%
+
+set MICROWAVEhost=192.168.2.65
+SET PACKETthreshold=1000
+SET DEVICEname=pod1
+SET SAVEfolder=./Manual_Microwave
+@REM ---------------Usage: udp_get.py [MICROWAVEhost] [PACKETthreshold] [DEVICEname] [SAVEfolder]
+%aerialpython% ./src/utils/udp_get.py %MICROWAVEhost% %PACKETthreshold% %DEVICEname% %SAVEfolder%
+pause
\ No newline at end of file

--
Gitblit v1.9.1