From 2269dd5008d91dc699a37bdc9749965b2450056c Mon Sep 17 00:00:00 2001
From: wu_xinjun <bent20140204@outlook.com>
Date: 星期一, 28 二月 2022 10:40:14 +0800
Subject: [PATCH] Merge commit 'f79b30a55db543bd1c7dd494a8c896df8841aa28'

---
 src/microwave/demo/udp_test_send.py          |   21 +
 src/microwave/demo/demoData/packet86.udp     |    0 
 src/microwave/demo/demoData/packet51.udp     |    0 
 src/microwave/demo/demoData/packet35.udp     |    0 
 src/microwave/demo/demoData/packet27.udp     |    0 
 src/microwave/demo/demoData/packet94.udp     |    0 
 src/microwave/demo/demoData/packet68.udp     |    0 
 src/microwave/demo/demoData/packet25.udp     |    0 
 src/microwave/demo/demoData/packet61.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/demo/demoData/packet17.udp     |    0 
 src/microwave/demo/demoData/packet5.udp      |    0 
 src/microwave/parsers.py                     |   23 +
 src/microwave/demo/demoData/packet37.udp     |    0 
 src/microwave/demo/AutoSendAndGetTest.bat    |   16 +
 src/microwave/demo/demoData/packet23.udp     |    0 
 src/microwave/demo/demoData/packet53.udp     |    0 
 src/microwave/demo/demoData/packet96.udp     |    0 
 src/microwave/demo/demoData/packet10.udp     |    0 
 src/microwave/demo/demoData/packet66.udp     |    0 
 src/microwave/demo/demoData/packet19.udp     |    0 
 src/microwave/demo/demoData/packet98.udp     |    0 
 src/microwave/demo/demoData/packet71.udp     |    0 
 src/microwave/demo/demoData/packet84.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/packet13.udp     |    0 
 src/microwave/demo/demoData/packet99.udp     |    0 
 src/microwave/demo/demoData/packet39.udp     |    0 
 src/microwave/demo/demoData/packet64.udp     |    0 
 src/microwave/demo/demoData/packet73.udp     |    0 
 src/microwave/constants.py                   |    2 
 src/microwave/demo/demoData/packet21.udp     |    0 
 src/microwave/demo/demoData/packet8.udp      |    0 
 src/microwave/components.py                  |  172 +++++++++++++
 src/microwave/demo/demoData/packet90.udp     |    0 
 src/microwave/demo/AutoSendUDPtest.bat       |   22 +
 src/microwave/demo/demoData/packet47.udp     |    0 
 src/microwave/demo/demoData/packet30.udp     |    0 
 src/microwave/demo/demoData/packet32.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/packet62.udp     |    0 
 src/microwave/demo/demoData/packet75.udp     |    0 
 src/microwave/demo/demoData/packet92.udp     |    0 
 src/microwave/demo/demoData/packet28.udp     |    0 
 src/microwave/demo/demoData/packet58.udp     |    0 
 src/microwave/demo/demoData/packet1.udp      |    0 
 src/microwave/demo/demoData/packet15.udp     |    0 
 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/packet85.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/udp_test_get.py           |   63 ++++
 src/microwave/demo/demoData/packet44.udp     |    0 
 src/microwave/demo/demoData/packet87.udp     |    0 
 src/microwave/demo/demoData/packet4.udp      |    0 
 src/microwave/demo/demoData/packet52.udp     |    0 
 src/microwave/demo/demoData/packet95.udp     |    0 
 src/microwave/demo/demoData/packet69.udp     |    0 
 src/microwave/demo/demoData/packet70.udp     |    0 
 src/microwave/demo/demoData/packet24.udp     |    0 
 src/microwave/demo/MicroWaveReceiverTest.py  |   31 ++
 src/microwave/demo/demoData/packet83.udp     |    0 
 src/microwave/demo/demoData/packet40.udp     |    0 
 src/microwave/demo/demoData/packet79.udp     |    0 
 src/microwave/demo/demoData/packet36.udp     |    0 
 src/microwave/demo/demoData/packet6.udp      |    0 
 src/microwave/demo/demoData/packet49.udp     |    0 
 src/microwave/demo/demoData/packet11.udp     |    0 
 src/microwave/demo/demoData/packet67.udp     |    0 
 src/microwave/demo/demoData/packet97.udp     |    0 
 src/microwave/demo/demoData/packet54.udp     |    0 
 src/microwave/demo/MicroWaveUDPServerTest.py |   57 ++++
 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/packet57.udp     |    0 
 src/microwave/demo/demoData/packet55.udp     |    0 
 src/microwave/demo/demoData/packet38.udp     |    0 
 src/microwave/demo/demoData/packet31.udp     |    0 
 src/microwave/demo/demoData/packet22.udp     |    0 
 src/microwave/demo/demoData/packet74.udp     |    0 
 src/microwave/demo/demoData/packet91.udp     |    0 
 src/microwave/demo/demoData/packet65.udp     |    0 
 src/microwave/demo/demoData/packet82.udp     |    0 
 bin2ply.bat                                  |   21 +
 src/microwave/demo/demoData/packet46.udp     |    0 
 src/microwave/demo/demoData/packet59.udp     |    0 
 src/microwave/demo/polty.ipynb               |   64 ++++
 src/microwave/demo/demoData/packet0.udp      |    0 
 src/microwave/demo/demoData/packet29.udp     |    0 
 src/microwave/demo/demoData/packet16.udp     |    0 
 src/microwave/demo/demoData/packet20.udp     |    0 
 src/microwave/demo/demoData/packet93.udp     |    0 
 src/microwave/demo/demoData/packet14.udp     |    0 
 src/microwave/demo/demoData/packet63.udp     |    0 
 src/microwave/demo/demoData/packet50.udp     |    0 
 src/microwave/demo/demoData/packet76.udp     |    0 
 src/microwave/demo/demoData/packet9.udp      |    0 
 src/microwave/demo/demoData/packet33.udp     |    0 
 src/microwave/demo/demoData/packet89.udp     |    0 
 src/microwave/__init__.py                    |    4 
 src/microwave/demo/demoData/packet80.udp     |    0 
 116 files changed, 721 insertions(+), 0 deletions(-)

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/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

--
Gitblit v1.9.1