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.
@@ -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".
@@ -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,3 @@
1
+ numpy
2
+ opencv-python
3
+ requests
@@ -0,0 +1,2 @@
1
+ rocket_welder_camera
2
+ tests
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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()