pyaidrone 1.0__py3-none-any.whl → 1.2__py3-none-any.whl
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.
- pyaidrone/__init__.py +1 -0
- pyaidrone/{AIDrone.py → aiDrone.py} +151 -151
- pyaidrone/packet.py +4 -4
- pyaidrone/parse.py +2 -2
- pyaidrone-1.2.dist-info/METADATA +25 -0
- pyaidrone-1.2.dist-info/RECORD +10 -0
- pyaidrone-1.0.dist-info/METADATA +0 -10
- pyaidrone-1.0.dist-info/RECORD +0 -10
- {pyaidrone-1.0.dist-info → pyaidrone-1.2.dist-info}/WHEEL +0 -0
- {pyaidrone-1.0.dist-info → pyaidrone-1.2.dist-info}/top_level.txt +0 -0
pyaidrone/__init__.py
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '1.2'
|
|
@@ -1,151 +1,151 @@
|
|
|
1
|
-
import serial
|
|
2
|
-
import binascii
|
|
3
|
-
import math
|
|
4
|
-
from time import sleep
|
|
5
|
-
import random
|
|
6
|
-
from operator import eq
|
|
7
|
-
from threading import Thread
|
|
8
|
-
from serial.tools.list_ports import comports
|
|
9
|
-
from pyaidrone.parse import *
|
|
10
|
-
from pyaidrone.packet import *
|
|
11
|
-
from pyaidrone.deflib import *
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class AIDrone(Parse, Packet):
|
|
15
|
-
def __init__(self, receiveCallback = None):
|
|
16
|
-
self.serial = None
|
|
17
|
-
self.isThreadRun = False
|
|
18
|
-
self.parse = Parse(AIDRONE)
|
|
19
|
-
self.makepkt = Packet(AIDRONE)
|
|
20
|
-
self.receiveCallback = receiveCallback
|
|
21
|
-
self.makepkt.clearPacket()
|
|
22
|
-
self.posX = 0
|
|
23
|
-
self.posY = 0
|
|
24
|
-
self.rot = 0
|
|
25
|
-
|
|
26
|
-
def receiveHandler(self):
|
|
27
|
-
while self.isThreadRun:
|
|
28
|
-
readData = self.serial.read(self.serial.in_waiting or 1)
|
|
29
|
-
packet = self.parse.packetArrange(readData)
|
|
30
|
-
if not eq(packet, "None"):
|
|
31
|
-
if self.receiveCallback != None:
|
|
32
|
-
self.receiveCallback(packet)
|
|
33
|
-
self.serial.write(self.makepkt.getPacket())
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def Open(self, portName = "None"):
|
|
37
|
-
if eq(portName, "None"):
|
|
38
|
-
nodes = comports()
|
|
39
|
-
for node in nodes:
|
|
40
|
-
if "CH340" in node.description:
|
|
41
|
-
portName = node.device
|
|
42
|
-
|
|
43
|
-
if eq(portName, "None"):
|
|
44
|
-
print("Can't find Serial Port")
|
|
45
|
-
exit()
|
|
46
|
-
return False
|
|
47
|
-
try:
|
|
48
|
-
self.serial = serial.Serial(port=portName, baudrate=115200, timeout=1)
|
|
49
|
-
if self.serial.isOpen():
|
|
50
|
-
self.isThreadRun = True
|
|
51
|
-
self.thread = Thread(target=self.receiveHandler, args=(), daemon=True)
|
|
52
|
-
self.thread.start()
|
|
53
|
-
print("Connected to", portName)
|
|
54
|
-
return True
|
|
55
|
-
else:
|
|
56
|
-
print("Can't open " + portName)
|
|
57
|
-
exit()
|
|
58
|
-
return False
|
|
59
|
-
except:
|
|
60
|
-
print("Can't open " + portName)
|
|
61
|
-
exit()
|
|
62
|
-
return False
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
def Close(self):
|
|
66
|
-
self.isThreadRun = False
|
|
67
|
-
sleep(0.2)
|
|
68
|
-
pkt = self.makepkt.getPacket()
|
|
69
|
-
if (pkt[15]&0x80) == 0x80:
|
|
70
|
-
self.makepkt.clearPacket()
|
|
71
|
-
self.setOption(0x8000)
|
|
72
|
-
self.serial.write(self.makepkt.getPacket())
|
|
73
|
-
sleep(0.2)
|
|
74
|
-
self.serial.write(self.makepkt.clearPacket())
|
|
75
|
-
sleep(0.2)
|
|
76
|
-
if self.serial != None:
|
|
77
|
-
if self.serial.isOpen() == True:
|
|
78
|
-
self.serial.close()
|
|
79
|
-
|
|
80
|
-
def setOption(self, option):
|
|
81
|
-
data = option.to_bytes(2, byteorder="little", signed=False)
|
|
82
|
-
self.makepkt.makePacket(14, data)
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def takeoff(self):
|
|
86
|
-
alt = 70
|
|
87
|
-
data = alt.to_bytes(2, byteorder="little", signed=False)
|
|
88
|
-
self.makepkt.makePacket(12, data)
|
|
89
|
-
alt = 0x2F
|
|
90
|
-
data = alt.to_bytes(2, byteorder="little", signed=False)
|
|
91
|
-
self.setOption(0x2F)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def landing(self):
|
|
95
|
-
alt = 0
|
|
96
|
-
data = alt.to_bytes(2, byteorder="little", signed=False)
|
|
97
|
-
self.makepkt.makePacket(12, data)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
def altitude(self, alt):
|
|
101
|
-
data = alt.to_bytes(2, byteorder="little", signed=False)
|
|
102
|
-
self.makepkt.makePacket(12, data)
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
def velocity(self, dir=0, vel=100):
|
|
106
|
-
if dir > 3:
|
|
107
|
-
return
|
|
108
|
-
if dir==1 or dir==3:
|
|
109
|
-
vel *= -1;
|
|
110
|
-
data = vel.to_bytes(2, byteorder="little", signed=True)
|
|
111
|
-
if dir==0 or dir==1:
|
|
112
|
-
self.makepkt.makePacket(8, data)
|
|
113
|
-
else:
|
|
114
|
-
self.makepkt.makePacket(6, data)
|
|
115
|
-
self.setOption(0x0F)
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
def move(self, dir=0, dist=100):
|
|
119
|
-
if dir > 3:
|
|
120
|
-
return
|
|
121
|
-
if dir==1 or dir==3:
|
|
122
|
-
dist *= -1;
|
|
123
|
-
if dir==0 or dir==1:
|
|
124
|
-
self.posX += dist
|
|
125
|
-
data = self.posX.to_bytes(2, byteorder="little", signed=True)
|
|
126
|
-
self.makepkt.makePacket(8, data)
|
|
127
|
-
else:
|
|
128
|
-
self.posY += dist
|
|
129
|
-
data = self.posY.to_bytes(2, byteorder="little", signed=True)
|
|
130
|
-
self.makepkt.makePacket(6, data)
|
|
131
|
-
self.setOption(0x2F)
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
def rotation(self, rot=90):
|
|
135
|
-
self.rot += rot
|
|
136
|
-
data = self.rot.to_bytes(2, byteorder="little", signed=True)
|
|
137
|
-
self.makepkt.makePacket(10, data)
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
def motor(self, what, speed):
|
|
141
|
-
speed = DefLib.constrain(speed, 100, 0)
|
|
142
|
-
data = speed.to_bytes(2, byteorder="little", signed=True)
|
|
143
|
-
self.makepkt.makePacket(what*2+6, data)
|
|
144
|
-
self.setOption(0x8000)
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
def emergency(self):
|
|
148
|
-
self.setOption(0x00)
|
|
149
|
-
self.serial.write(self.makepkt.getPacket())
|
|
150
|
-
|
|
151
|
-
|
|
1
|
+
import serial
|
|
2
|
+
import binascii
|
|
3
|
+
import math
|
|
4
|
+
from time import sleep
|
|
5
|
+
import random
|
|
6
|
+
from operator import eq
|
|
7
|
+
from threading import Thread
|
|
8
|
+
from serial.tools.list_ports import comports
|
|
9
|
+
from pyaidrone.parse import *
|
|
10
|
+
from pyaidrone.packet import *
|
|
11
|
+
from pyaidrone.deflib import *
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class AIDrone(Parse, Packet):
|
|
15
|
+
def __init__(self, receiveCallback = None):
|
|
16
|
+
self.serial = None
|
|
17
|
+
self.isThreadRun = False
|
|
18
|
+
self.parse = Parse(AIDRONE)
|
|
19
|
+
self.makepkt = Packet(AIDRONE)
|
|
20
|
+
self.receiveCallback = receiveCallback
|
|
21
|
+
self.makepkt.clearPacket()
|
|
22
|
+
self.posX = 0
|
|
23
|
+
self.posY = 0
|
|
24
|
+
self.rot = 0
|
|
25
|
+
|
|
26
|
+
def receiveHandler(self):
|
|
27
|
+
while self.isThreadRun:
|
|
28
|
+
readData = self.serial.read(self.serial.in_waiting or 1)
|
|
29
|
+
packet = self.parse.packetArrange(readData)
|
|
30
|
+
if not eq(packet, "None"):
|
|
31
|
+
if self.receiveCallback != None:
|
|
32
|
+
self.receiveCallback(packet)
|
|
33
|
+
self.serial.write(self.makepkt.getPacket())
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def Open(self, portName = "None"):
|
|
37
|
+
if eq(portName, "None"):
|
|
38
|
+
nodes = comports()
|
|
39
|
+
for node in nodes:
|
|
40
|
+
if "CH340" in node.description:
|
|
41
|
+
portName = node.device
|
|
42
|
+
|
|
43
|
+
if eq(portName, "None"):
|
|
44
|
+
print("Can't find Serial Port")
|
|
45
|
+
exit()
|
|
46
|
+
return False
|
|
47
|
+
try:
|
|
48
|
+
self.serial = serial.Serial(port=portName, baudrate=115200, timeout=1)
|
|
49
|
+
if self.serial.isOpen():
|
|
50
|
+
self.isThreadRun = True
|
|
51
|
+
self.thread = Thread(target=self.receiveHandler, args=(), daemon=True)
|
|
52
|
+
self.thread.start()
|
|
53
|
+
print("Connected to", portName)
|
|
54
|
+
return True
|
|
55
|
+
else:
|
|
56
|
+
print("Can't open " + portName)
|
|
57
|
+
exit()
|
|
58
|
+
return False
|
|
59
|
+
except:
|
|
60
|
+
print("Can't open " + portName)
|
|
61
|
+
exit()
|
|
62
|
+
return False
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def Close(self):
|
|
66
|
+
self.isThreadRun = False
|
|
67
|
+
sleep(0.2)
|
|
68
|
+
pkt = self.makepkt.getPacket()
|
|
69
|
+
if (pkt[15]&0x80) == 0x80:
|
|
70
|
+
self.makepkt.clearPacket()
|
|
71
|
+
self.setOption(0x8000)
|
|
72
|
+
self.serial.write(self.makepkt.getPacket())
|
|
73
|
+
sleep(0.2)
|
|
74
|
+
self.serial.write(self.makepkt.clearPacket())
|
|
75
|
+
sleep(0.2)
|
|
76
|
+
if self.serial != None:
|
|
77
|
+
if self.serial.isOpen() == True:
|
|
78
|
+
self.serial.close()
|
|
79
|
+
|
|
80
|
+
def setOption(self, option):
|
|
81
|
+
data = option.to_bytes(2, byteorder="little", signed=False)
|
|
82
|
+
self.makepkt.makePacket(14, data)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def takeoff(self):
|
|
86
|
+
alt = 70
|
|
87
|
+
data = alt.to_bytes(2, byteorder="little", signed=False)
|
|
88
|
+
self.makepkt.makePacket(12, data)
|
|
89
|
+
alt = 0x2F
|
|
90
|
+
data = alt.to_bytes(2, byteorder="little", signed=False)
|
|
91
|
+
self.setOption(0x2F)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def landing(self):
|
|
95
|
+
alt = 0
|
|
96
|
+
data = alt.to_bytes(2, byteorder="little", signed=False)
|
|
97
|
+
self.makepkt.makePacket(12, data)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def altitude(self, alt):
|
|
101
|
+
data = alt.to_bytes(2, byteorder="little", signed=False)
|
|
102
|
+
self.makepkt.makePacket(12, data)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def velocity(self, dir=0, vel=100):
|
|
106
|
+
if dir > 3:
|
|
107
|
+
return
|
|
108
|
+
if dir==1 or dir==3:
|
|
109
|
+
vel *= -1;
|
|
110
|
+
data = vel.to_bytes(2, byteorder="little", signed=True)
|
|
111
|
+
if dir==0 or dir==1:
|
|
112
|
+
self.makepkt.makePacket(8, data)
|
|
113
|
+
else:
|
|
114
|
+
self.makepkt.makePacket(6, data)
|
|
115
|
+
self.setOption(0x0F)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def move(self, dir=0, dist=100):
|
|
119
|
+
if dir > 3:
|
|
120
|
+
return
|
|
121
|
+
if dir==1 or dir==3:
|
|
122
|
+
dist *= -1;
|
|
123
|
+
if dir==0 or dir==1:
|
|
124
|
+
self.posX += dist
|
|
125
|
+
data = self.posX.to_bytes(2, byteorder="little", signed=True)
|
|
126
|
+
self.makepkt.makePacket(8, data)
|
|
127
|
+
else:
|
|
128
|
+
self.posY += dist
|
|
129
|
+
data = self.posY.to_bytes(2, byteorder="little", signed=True)
|
|
130
|
+
self.makepkt.makePacket(6, data)
|
|
131
|
+
self.setOption(0x2F)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def rotation(self, rot=90):
|
|
135
|
+
self.rot += rot
|
|
136
|
+
data = self.rot.to_bytes(2, byteorder="little", signed=True)
|
|
137
|
+
self.makepkt.makePacket(10, data)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def motor(self, what, speed):
|
|
141
|
+
speed = DefLib.constrain(speed, 100, 0)
|
|
142
|
+
data = speed.to_bytes(2, byteorder="little", signed=True)
|
|
143
|
+
self.makepkt.makePacket(what*2+6, data)
|
|
144
|
+
self.setOption(0x8000)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def emergency(self):
|
|
148
|
+
self.setOption(0x00)
|
|
149
|
+
self.serial.write(self.makepkt.getPacket())
|
|
150
|
+
|
|
151
|
+
|
pyaidrone/packet.py
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
from
|
|
1
|
+
from pyaidrone.deflib import *
|
|
2
2
|
|
|
3
3
|
class Packet:
|
|
4
|
-
def __init__(self, model =
|
|
4
|
+
def __init__(self, model = AIDRONE):
|
|
5
5
|
self.model = model
|
|
6
6
|
self.packet = bytearray(20)
|
|
7
|
-
if self.model ==
|
|
7
|
+
if self.model == AIDRONE:
|
|
8
8
|
self.packet[0:5] = [0x26, 0xA8, 0x14, 0xB1, 0x14]
|
|
9
9
|
|
|
10
10
|
def getPacket(self):
|
|
@@ -22,7 +22,7 @@ class Packet:
|
|
|
22
22
|
def clearPacket(self):
|
|
23
23
|
for n in range(5, 20):
|
|
24
24
|
self.packet[n] = 0
|
|
25
|
-
if self.model ==
|
|
25
|
+
if self.model == AIDRONE:
|
|
26
26
|
self.packet[5] = self.packet[14] = 0x01
|
|
27
27
|
self.packet[16] = self.packet[18] = 0x64
|
|
28
28
|
return self.packet
|
pyaidrone/parse.py
CHANGED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: pyaidrone
|
|
3
|
+
Version: 1.2
|
|
4
|
+
Summary: Library for AIDrone Products
|
|
5
|
+
Home-page: http://www.ir-brain.com
|
|
6
|
+
Author: IR-Brain
|
|
7
|
+
Author-email: ceo@ir-brain.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: pyserial (>=3.4)
|
|
14
|
+
Requires-Dist: pynput (>=1.7.3)
|
|
15
|
+
|
|
16
|
+
## install pyaidrone
|
|
17
|
+
|
|
18
|
+
> python setup.py install
|
|
19
|
+
> or
|
|
20
|
+
> python install pyaidrone
|
|
21
|
+
|
|
22
|
+
### install Packages
|
|
23
|
+
|
|
24
|
+
> pip install pyserial
|
|
25
|
+
> pip install pynput
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
pyaidrone/__init__.py,sha256=LTT-ZpL6vrKdC5t0O71pJnk3zMhDf1eXkNmoLoIRupo,19
|
|
2
|
+
pyaidrone/aiDrone.py,sha256=OawlhlEHgG3wRjkb54p9OBceX2D-BimvVGjdUiwABNg,4713
|
|
3
|
+
pyaidrone/deflib.py,sha256=ZeA_qfnhuXEIhJHUMNSKkCkBEaWuoIS5X7ZqjTo9Sx4,735
|
|
4
|
+
pyaidrone/ikeyevent.py,sha256=ZpRiFu71GhW2XQgyiXzCvb2FYoLU8bH4fVeaKoGEMqM,2866
|
|
5
|
+
pyaidrone/packet.py,sha256=h02k9dMUhP4oyEBaDuJ9L9HdutfZE_znreBmPOfTLog,813
|
|
6
|
+
pyaidrone/parse.py,sha256=5kU1JwQwUXTJ201ewRnnzpwDyZ0jjstHNTKQvku9svA,1364
|
|
7
|
+
pyaidrone-1.2.dist-info/METADATA,sha256=8l1JfRPvK4--eqNNj-zYoxj9VAuYKLtRUSVGUTxFfUU,593
|
|
8
|
+
pyaidrone-1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
|
9
|
+
pyaidrone-1.2.dist-info/top_level.txt,sha256=YLnJwG3F2TdfFcg6r7jcx02fekcXHF_GC0nv12hJGT8,10
|
|
10
|
+
pyaidrone-1.2.dist-info/RECORD,,
|
pyaidrone-1.0.dist-info/METADATA
DELETED
pyaidrone-1.0.dist-info/RECORD
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
pyaidrone/AIDrone.py,sha256=p0-JQtpzmv_TCk1EY9lmkoa8JCJ43Q8ByBVwkgM0QOY,4562
|
|
2
|
-
pyaidrone/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
pyaidrone/deflib.py,sha256=ZeA_qfnhuXEIhJHUMNSKkCkBEaWuoIS5X7ZqjTo9Sx4,735
|
|
4
|
-
pyaidrone/ikeyevent.py,sha256=ZpRiFu71GhW2XQgyiXzCvb2FYoLU8bH4fVeaKoGEMqM,2866
|
|
5
|
-
pyaidrone/packet.py,sha256=sA7v9MbptPVxCm1_Lah1vHnoeQdrWY87NH-C5CP4Gz8,810
|
|
6
|
-
pyaidrone/parse.py,sha256=J8FOblxPhWw9VpovaBLgltkL7YVX0HXLZHTzH6519G8,1363
|
|
7
|
-
pyaidrone-1.0.dist-info/METADATA,sha256=QBFVuZgu0Qa5Tc9UJadDQA31xLlaDI4jqmED0NE82KU,237
|
|
8
|
-
pyaidrone-1.0.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
|
9
|
-
pyaidrone-1.0.dist-info/top_level.txt,sha256=YLnJwG3F2TdfFcg6r7jcx02fekcXHF_GC0nv12hJGT8,10
|
|
10
|
-
pyaidrone-1.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|