pyaidrone 1.6__tar.gz → 1.8__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.

Potentially problematic release.


This version of pyaidrone might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyaidrone
3
- Version: 1.6
3
+ Version: 1.8
4
4
  Summary: Library for AIDrone Products
5
5
  Home-page: http://www.ir-brain.com
6
6
  Author: IR-Brain
@@ -22,7 +22,11 @@ class AIDrone(Parse, Packet):
22
22
  self.posX = 0
23
23
  self.posY = 0
24
24
  self.rot = 0
25
-
25
+ # --- 영상 스트리밍 관련 기본값 ---
26
+ self.stream_host = "192.168.4.1"
27
+ self.stream_port = 80
28
+ self.stream_path = "/?action=stream"
29
+ self._cap = None
26
30
 
27
31
  def receiveHandler(self):
28
32
  while self.isThreadRun:
@@ -149,6 +153,66 @@ class AIDrone(Parse, Packet):
149
153
  def emergency(self):
150
154
  self.setOption(0x00)
151
155
  self.serial.write(self.makepkt.getPacket())
156
+
157
+ # aiDrone.py — AIDrone 클래스 안에 아래 3개 메서드 추가
158
+ def setStreamAddress(self, host: str, port: int = 80, path: str = "/?action=stream"):
159
+ """MJPG-Streamer 주소 구성 요소를 저장합니다."""
160
+ if not isinstance(host, str) or len(host.strip()) == 0:
161
+ raise ValueError("host가 올바르지 않습니다.")
162
+ self.stream_host = host.strip()
163
+ self.stream_port = int(port)
164
+ if not path.startswith("/"):
165
+ path = "/" + path
166
+ self.stream_path = path
167
+ return self._build_stream_url()
168
+
169
+ def _build_stream_url(self):
170
+ """내부 사용: 저장된 host/port/path로 URL 생성."""
171
+ if self.stream_port in (80, None):
172
+ return f"http://{self.stream_host}{self.stream_path}"
173
+ return f"http://{self.stream_host}:{self.stream_port}{self.stream_path}"
174
+
175
+ def streamon(self, host: str = None, port: int = None, path: str = None, return_url: bool = False):
176
+ """
177
+ MJPG-Streamer 스트림을 엽니다.
178
+ - 인자를 주면 해당 값으로 주소를 덮어쓰고, 안 주면 저장된 값 사용.
179
+ - return_url=True 이면 URL 문자열만 반환(캡처는 열지 않음).
180
+ - 기본 URL 예: http://192.168.4.1/?action=stream
181
+ """
182
+ if host is not None or port is not None or path is not None:
183
+ self.setStreamAddress(host or self.stream_host,
184
+ self.stream_port if port is None else port,
185
+ self.stream_path if path is None else path)
186
+
187
+ url = self._build_stream_url()
188
+ if return_url:
189
+ return url
190
+
191
+ # OpenCV는 여기서만 임포트(필요할 때만)
192
+ try:
193
+ import cv2 as cv
194
+ except Exception as e:
195
+ raise RuntimeError(f"OpenCV(cv2) 임포트 실패: {e}")
196
+
197
+ # 이전 cap이 열려 있으면 정리
198
+ self.streamoff()
199
+
200
+ self._cap = cv.VideoCapture(url)
201
+ if not self._cap.isOpened():
202
+ self._cap.release()
203
+ self._cap = None
204
+ raise RuntimeError(f"스트림 열기 실패: {url}")
205
+ return self._cap
206
+
207
+ def streamoff(self):
208
+ """열려 있는 스트림을 닫습니다."""
209
+ if self._cap is not None:
210
+ try:
211
+ self._cap.release()
212
+ except Exception:
213
+ pass
214
+ self._cap = None
215
+
152
216
 
153
217
 
154
218
 
@@ -22,8 +22,10 @@ class IKeyEvent:
22
22
  self.keyLTurn = True
23
23
  if key == keyboard.KeyCode(char="d"):
24
24
  self.keyRTurn = True
25
- if key == keyboard.KeyCode(char="k"):
26
- self.keyRTurn = True
25
+ if key == keyboard.KeyCode(char="r"):
26
+ self.keyRecording = True
27
+ if key == keyboard.KeyCode(char="s"):
28
+ self.keyPicture = True
27
29
  if key == keyboard.Key.esc:
28
30
  self.keyEsc = True
29
31
 
@@ -48,8 +50,10 @@ class IKeyEvent:
48
50
  self.keyLTurn = False
49
51
  if key == keyboard.KeyCode(char="d"):
50
52
  self.keyRTurn = False
51
- if key == keyboard.KeyCode(char="v"):
52
- self.keyRTurn = False
53
+ if key == keyboard.KeyCode(char="r"):
54
+ self.keyRecording = False
55
+ if key == keyboard.KeyCode(char="s"):
56
+ self.keyPicture = False
53
57
  if key == keyboard.Key.esc:
54
58
  self.keyEsc = False
55
59
 
@@ -58,13 +62,14 @@ class IKeyEvent:
58
62
  self.keySpace = False
59
63
  self.keyUp = False
60
64
  self.keyDown = False
65
+ self.keyRight= False
61
66
  self.keyLeft = False
62
- self.keyRight = False
63
67
  self.keyGoUp = False
64
68
  self.keyGoDown = False
65
69
  self.keyLTurn= False
66
70
  self.keyRTurn = False
67
- self.keyVideo = False
71
+ self.keyRecording = False
72
+ self.keyPicture = False
68
73
  self.keyEsc = False
69
74
 
70
75
  listener = keyboard.Listener(on_press=self.on_press, on_release=self.on_release)
@@ -99,9 +104,12 @@ class IKeyEvent:
99
104
 
100
105
  def isKeyDPressed(self):
101
106
  return self.keyRTurn
102
-
103
- def isKeyVPressed(self):
104
- return self.keyVideo
107
+
108
+ def isKeyRPressed(self):
109
+ return self.keyRecording
110
+
111
+ def isKeySPressed(self):
112
+ return self.keyPicture
105
113
 
106
114
  def isKeyEscPressed(self):
107
115
  return self.keyEsc
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyaidrone
3
- Version: 1.6
3
+ Version: 1.8
4
4
  Summary: Library for AIDrone Products
5
5
  Home-page: http://www.ir-brain.com
6
6
  Author: IR-Brain
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="pyaidrone",
5
- version="1.6",
5
+ version="1.8",
6
6
  description="Library for AIDrone Products",
7
7
  long_description=open("README.md").read(), # README.md 내용을 long_description으로 사용
8
8
  long_description_content_type="text/markdown", # README 파일이 markdown 형식임을 지정
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes