rocket-welder-sdk 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rocket_welder_sdk-0.0.1/PKG-INFO +51 -0
- rocket_welder_sdk-0.0.1/README.md +35 -0
- rocket_welder_sdk-0.0.1/rocket_welder_camera/__init__.py +0 -0
- rocket_welder_sdk-0.0.1/rocket_welder_camera/camera.py +76 -0
- rocket_welder_sdk-0.0.1/rocket_welder_sdk.egg-info/PKG-INFO +51 -0
- rocket_welder_sdk-0.0.1/rocket_welder_sdk.egg-info/SOURCES.txt +11 -0
- rocket_welder_sdk-0.0.1/rocket_welder_sdk.egg-info/dependency_links.txt +1 -0
- rocket_welder_sdk-0.0.1/rocket_welder_sdk.egg-info/requires.txt +3 -0
- rocket_welder_sdk-0.0.1/rocket_welder_sdk.egg-info/top_level.txt +2 -0
- rocket_welder_sdk-0.0.1/setup.cfg +4 -0
- rocket_welder_sdk-0.0.1/setup.py +33 -0
- rocket_welder_sdk-0.0.1/tests/__init__.py +0 -0
- rocket_welder_sdk-0.0.1/tests/test_camera.py +36 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: rocket-welder-sdk
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Supporting sdk for RocketWelder
|
|
5
|
+
Home-page: https://github.com/rocket-welder-sdk/rocket-welder-sdk
|
|
6
|
+
Author: Rafal Maciag
|
|
7
|
+
Author-email: rafal.maciag@modelingevolution.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Requires-Python: >=3.6
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
Requires-Dist: numpy
|
|
14
|
+
Requires-Dist: opencv-python
|
|
15
|
+
Requires-Dist: requests
|
|
16
|
+
|
|
17
|
+
# SDK for Rocket Welder
|
|
18
|
+
|
|
19
|
+
Example
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
# main.py
|
|
23
|
+
import cv2
|
|
24
|
+
from rocket_welder_camera.camera import RocketWelderCamera
|
|
25
|
+
|
|
26
|
+
def main():
|
|
27
|
+
url = 'tcp://{YOUR-HOST}:{YOUR-PORT}/{STREAM-NAME}'
|
|
28
|
+
cam = RocketWelderCamera(url)
|
|
29
|
+
|
|
30
|
+
cv2.namedWindow('Frame', cv2.WINDOW_NORMAL)
|
|
31
|
+
|
|
32
|
+
while True:
|
|
33
|
+
frame = cam.get_frame()
|
|
34
|
+
if frame is not None:
|
|
35
|
+
# Display the frame
|
|
36
|
+
cv2.imshow('Frame', frame)
|
|
37
|
+
|
|
38
|
+
# Print the current frame number
|
|
39
|
+
# print(f'Frame number: {cam.current_frame}')
|
|
40
|
+
|
|
41
|
+
# Exit loop if 'q' is pressed
|
|
42
|
+
if cv2.waitKey(1) & 0xFF == ord('q'):
|
|
43
|
+
break
|
|
44
|
+
|
|
45
|
+
cv2.destroyAllWindows()
|
|
46
|
+
|
|
47
|
+
if __name__ == '__main__':
|
|
48
|
+
main()
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Usually, YOUR-PORT is 7000 and YOUR-STREAM is "default".
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# SDK for Rocket Welder
|
|
2
|
+
|
|
3
|
+
Example
|
|
4
|
+
|
|
5
|
+
```python
|
|
6
|
+
# main.py
|
|
7
|
+
import cv2
|
|
8
|
+
from rocket_welder_camera.camera import RocketWelderCamera
|
|
9
|
+
|
|
10
|
+
def main():
|
|
11
|
+
url = 'tcp://{YOUR-HOST}:{YOUR-PORT}/{STREAM-NAME}'
|
|
12
|
+
cam = RocketWelderCamera(url)
|
|
13
|
+
|
|
14
|
+
cv2.namedWindow('Frame', cv2.WINDOW_NORMAL)
|
|
15
|
+
|
|
16
|
+
while True:
|
|
17
|
+
frame = cam.get_frame()
|
|
18
|
+
if frame is not None:
|
|
19
|
+
# Display the frame
|
|
20
|
+
cv2.imshow('Frame', frame)
|
|
21
|
+
|
|
22
|
+
# Print the current frame number
|
|
23
|
+
# print(f'Frame number: {cam.current_frame}')
|
|
24
|
+
|
|
25
|
+
# Exit loop if 'q' is pressed
|
|
26
|
+
if cv2.waitKey(1) & 0xFF == ord('q'):
|
|
27
|
+
break
|
|
28
|
+
|
|
29
|
+
cv2.destroyAllWindows()
|
|
30
|
+
|
|
31
|
+
if __name__ == '__main__':
|
|
32
|
+
main()
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Usually, YOUR-PORT is 7000 and YOUR-STREAM is "default".
|
|
File without changes
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# rocket_welder_camera/camera.py
|
|
2
|
+
import cv2
|
|
3
|
+
import threading
|
|
4
|
+
import socket
|
|
5
|
+
import struct
|
|
6
|
+
import numpy as np
|
|
7
|
+
from urllib.parse import urlparse
|
|
8
|
+
|
|
9
|
+
class RocketWelderCamera:
|
|
10
|
+
def __init__(self, url):
|
|
11
|
+
self.url = url
|
|
12
|
+
parsed_url = urlparse(url)
|
|
13
|
+
self.host = parsed_url.hostname
|
|
14
|
+
self.port = parsed_url.port
|
|
15
|
+
self.stream_name = parsed_url.path[1:]
|
|
16
|
+
self.buffer_size = 10
|
|
17
|
+
self.circular_buffer = [None] * self.buffer_size
|
|
18
|
+
self.current_frame = -1
|
|
19
|
+
self.lock = threading.Lock()
|
|
20
|
+
self.thread = threading.Thread(target=self.receive_frames)
|
|
21
|
+
self.thread.daemon = True
|
|
22
|
+
self.thread.start()
|
|
23
|
+
|
|
24
|
+
@staticmethod
|
|
25
|
+
def write_prefixed_ascii_string(socket, value):
|
|
26
|
+
# Encode the string to ASCII bytes
|
|
27
|
+
name = value.encode('ascii')
|
|
28
|
+
|
|
29
|
+
# Send the length of the string as a single byte
|
|
30
|
+
length_byte = len(name).to_bytes(1, 'little')
|
|
31
|
+
socket.send(length_byte)
|
|
32
|
+
|
|
33
|
+
# Send the actual ASCII bytes
|
|
34
|
+
socket.send(name)
|
|
35
|
+
|
|
36
|
+
def receive_frames(self):
|
|
37
|
+
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
38
|
+
sock.connect((self.host, self.port))
|
|
39
|
+
self.write_prefixed_ascii_string(sock,self.stream_name)
|
|
40
|
+
|
|
41
|
+
while True:
|
|
42
|
+
header_data = sock.recv(32)
|
|
43
|
+
if len(header_data) != 32:
|
|
44
|
+
continue
|
|
45
|
+
|
|
46
|
+
frame_number, frame_size, stream_position, xor = struct.unpack('<QQQQ', header_data)
|
|
47
|
+
xor_check = frame_number ^ frame_size ^ stream_position
|
|
48
|
+
if frame_size == 0 or xor_check != xor:
|
|
49
|
+
continue
|
|
50
|
+
|
|
51
|
+
frame_size = int(frame_size)
|
|
52
|
+
frame_data = b''
|
|
53
|
+
|
|
54
|
+
while len(frame_data) < frame_size:
|
|
55
|
+
packet = sock.recv(frame_size - len(frame_data))
|
|
56
|
+
if not packet:
|
|
57
|
+
break
|
|
58
|
+
frame_data += packet
|
|
59
|
+
|
|
60
|
+
if len(frame_data) != frame_size:
|
|
61
|
+
continue
|
|
62
|
+
|
|
63
|
+
frame = np.frombuffer(frame_data, dtype=np.uint8)
|
|
64
|
+
image = cv2.imdecode(frame, cv2.IMREAD_COLOR)
|
|
65
|
+
|
|
66
|
+
with self.lock:
|
|
67
|
+
self.current_frame = (self.current_frame + 1) % self.buffer_size
|
|
68
|
+
self.circular_buffer[self.current_frame] = image
|
|
69
|
+
|
|
70
|
+
def get_frame(self):
|
|
71
|
+
with self.lock:
|
|
72
|
+
frame = self.circular_buffer[self.current_frame]
|
|
73
|
+
if frame is not None:
|
|
74
|
+
return frame
|
|
75
|
+
else:
|
|
76
|
+
return None
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: rocket-welder-sdk
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Supporting sdk for RocketWelder
|
|
5
|
+
Home-page: https://github.com/rocket-welder-sdk/rocket-welder-sdk
|
|
6
|
+
Author: Rafal Maciag
|
|
7
|
+
Author-email: rafal.maciag@modelingevolution.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Requires-Python: >=3.6
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
Requires-Dist: numpy
|
|
14
|
+
Requires-Dist: opencv-python
|
|
15
|
+
Requires-Dist: requests
|
|
16
|
+
|
|
17
|
+
# SDK for Rocket Welder
|
|
18
|
+
|
|
19
|
+
Example
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
# main.py
|
|
23
|
+
import cv2
|
|
24
|
+
from rocket_welder_camera.camera import RocketWelderCamera
|
|
25
|
+
|
|
26
|
+
def main():
|
|
27
|
+
url = 'tcp://{YOUR-HOST}:{YOUR-PORT}/{STREAM-NAME}'
|
|
28
|
+
cam = RocketWelderCamera(url)
|
|
29
|
+
|
|
30
|
+
cv2.namedWindow('Frame', cv2.WINDOW_NORMAL)
|
|
31
|
+
|
|
32
|
+
while True:
|
|
33
|
+
frame = cam.get_frame()
|
|
34
|
+
if frame is not None:
|
|
35
|
+
# Display the frame
|
|
36
|
+
cv2.imshow('Frame', frame)
|
|
37
|
+
|
|
38
|
+
# Print the current frame number
|
|
39
|
+
# print(f'Frame number: {cam.current_frame}')
|
|
40
|
+
|
|
41
|
+
# Exit loop if 'q' is pressed
|
|
42
|
+
if cv2.waitKey(1) & 0xFF == ord('q'):
|
|
43
|
+
break
|
|
44
|
+
|
|
45
|
+
cv2.destroyAllWindows()
|
|
46
|
+
|
|
47
|
+
if __name__ == '__main__':
|
|
48
|
+
main()
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Usually, YOUR-PORT is 7000 and YOUR-STREAM is "default".
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
setup.py
|
|
3
|
+
rocket_welder_camera/__init__.py
|
|
4
|
+
rocket_welder_camera/camera.py
|
|
5
|
+
rocket_welder_sdk.egg-info/PKG-INFO
|
|
6
|
+
rocket_welder_sdk.egg-info/SOURCES.txt
|
|
7
|
+
rocket_welder_sdk.egg-info/dependency_links.txt
|
|
8
|
+
rocket_welder_sdk.egg-info/requires.txt
|
|
9
|
+
rocket_welder_sdk.egg-info/top_level.txt
|
|
10
|
+
tests/__init__.py
|
|
11
|
+
tests/test_camera.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from setuptools import setup, find_packages
|
|
2
|
+
|
|
3
|
+
with open("README.md", "r") as fh:
|
|
4
|
+
long_description = fh.read()
|
|
5
|
+
|
|
6
|
+
setup(
|
|
7
|
+
name="rocket-welder-sdk",
|
|
8
|
+
version="0.0.1",
|
|
9
|
+
author="Rafal Maciag",
|
|
10
|
+
author_email="rafal.maciag@modelingevolution.com",
|
|
11
|
+
description="Supporting sdk for RocketWelder",
|
|
12
|
+
long_description=long_description,
|
|
13
|
+
long_description_content_type="text/markdown",
|
|
14
|
+
url="https://github.com/rocket-welder-sdk/rocket-welder-sdk",
|
|
15
|
+
packages=find_packages(),
|
|
16
|
+
install_requires=[
|
|
17
|
+
'numpy',
|
|
18
|
+
'opencv-python',
|
|
19
|
+
'requests', # Add any other dependencies here
|
|
20
|
+
],
|
|
21
|
+
classifiers=[
|
|
22
|
+
"Programming Language :: Python :: 3",
|
|
23
|
+
"License :: OSI Approved :: MIT License",
|
|
24
|
+
"Operating System :: OS Independent",
|
|
25
|
+
],
|
|
26
|
+
python_requires='>=3.6',
|
|
27
|
+
package_data={
|
|
28
|
+
'rocket_welder_camera': ['*.py'], # Include only Python files
|
|
29
|
+
},
|
|
30
|
+
exclude_package_data={
|
|
31
|
+
'': ['tests/*'], # Exclude test files
|
|
32
|
+
},
|
|
33
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# tests/test_camera.py
|
|
2
|
+
import unittest
|
|
3
|
+
from unittest.mock import patch, MagicMock
|
|
4
|
+
import numpy as np
|
|
5
|
+
from rocket_welder_camera.camera import RocketWelderCamera
|
|
6
|
+
import struct
|
|
7
|
+
|
|
8
|
+
class TestRocketWelderCamera(unittest.TestCase):
|
|
9
|
+
@patch('rocket_welder_camera.camera.socket.socket')
|
|
10
|
+
@patch('rocket_welder_camera.camera.cv2.imdecode')
|
|
11
|
+
def test_receive_frames(self, mock_imdecode, mock_socket):
|
|
12
|
+
mock_sock_instance = MagicMock()
|
|
13
|
+
mock_socket.return_value = mock_sock_instance
|
|
14
|
+
mock_sock_instance.recv.side_effect = [
|
|
15
|
+
struct.pack('>QQQ', 1, 5, 1), # Mock header
|
|
16
|
+
b'\x00\x01\x02\x03\x04' # Mock frame data
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
mock_imdecode.return_value = np.zeros((480, 640, 3), dtype=np.uint8)
|
|
20
|
+
|
|
21
|
+
camera = RocketWelderCamera('tcp://pi-51:8082/a')
|
|
22
|
+
camera.receive_frames()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
frame = camera.get_frame()
|
|
26
|
+
|
|
27
|
+
self.assertIsNotNone(frame)
|
|
28
|
+
self.assertEqual(frame.shape, (480, 640, 3))
|
|
29
|
+
|
|
30
|
+
def test_get_frame_empty_buffer(self):
|
|
31
|
+
camera = RocketWelderCamera('tcp://pi-51:8082/a')
|
|
32
|
+
frame = camera.get_frame()
|
|
33
|
+
self.assertIsNone(frame)
|
|
34
|
+
|
|
35
|
+
if __name__ == '__main__':
|
|
36
|
+
unittest.main()
|