pyaidrone 1.5__tar.gz → 1.7__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.5
3
+ Version: 1.7
4
4
  Summary: Library for AIDrone Products
5
5
  Home-page: http://www.ir-brain.com
6
6
  Author: IR-Brain
@@ -21,9 +21,12 @@ class AIDrone(Parse, Packet):
21
21
  self.makepkt.clearPacket()
22
22
  self.posX = 0
23
23
  self.posY = 0
24
- self.rot = 0
25
-
26
-
24
+ self.rot = 0
25
+ # --- 영상 스트리밍 관련 기본값 ---
26
+ self.stream_host = "192.168.4.1"
27
+ self.stream_port = 80
28
+ self.stream_path = "/?action=stream"
29
+ self._cap = None
27
30
 
28
31
  def receiveHandler(self):
29
32
  while self.isThreadRun:
@@ -150,6 +153,66 @@ class AIDrone(Parse, Packet):
150
153
  def emergency(self):
151
154
  self.setOption(0x00)
152
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
+
153
216
 
154
217
 
155
218
 
@@ -22,8 +22,8 @@ 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="s"):
26
+ self.keyPicture = True
27
27
  if key == keyboard.Key.esc:
28
28
  self.keyEsc = True
29
29
 
@@ -48,8 +48,8 @@ class IKeyEvent:
48
48
  self.keyLTurn = False
49
49
  if key == keyboard.KeyCode(char="d"):
50
50
  self.keyRTurn = False
51
- if key == keyboard.KeyCode(char="v"):
52
- self.keyRTurn = False
51
+ if key == keyboard.KeyCode(char="s"):
52
+ self.keyPicture = False
53
53
  if key == keyboard.Key.esc:
54
54
  self.keyEsc = False
55
55
 
@@ -58,13 +58,13 @@ class IKeyEvent:
58
58
  self.keySpace = False
59
59
  self.keyUp = False
60
60
  self.keyDown = False
61
+ self.keyRight= False
61
62
  self.keyLeft = False
62
- self.keyRight = False
63
63
  self.keyGoUp = False
64
64
  self.keyGoDown = False
65
65
  self.keyLTurn= False
66
66
  self.keyRTurn = False
67
- self.keyVideo = False
67
+ self.keyPicture = False
68
68
  self.keyEsc = False
69
69
 
70
70
  listener = keyboard.Listener(on_press=self.on_press, on_release=self.on_release)
@@ -100,8 +100,8 @@ class IKeyEvent:
100
100
  def isKeyDPressed(self):
101
101
  return self.keyRTurn
102
102
 
103
- def isKeyVPressed(self):
104
- return self.keyVideo
103
+ def isKeySPressed(self):
104
+ return self.keyPicture
105
105
 
106
106
  def isKeyEscPressed(self):
107
107
  return self.keyEsc
@@ -40,7 +40,6 @@ class Parse:
40
40
  self.offset = 0
41
41
  chksum = DefLib.checksum(self.packet)
42
42
  if chksum == self.packet[5]:
43
- self.parseSensorData(slef.packet)
44
43
  return self.packet
45
44
  return "None"
46
45
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyaidrone
3
- Version: 1.5
3
+ Version: 1.7
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.5",
5
+ version="1.7",
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