Skip to content

Commit a5f3f20

Browse files
committed
This was not working. Still for Python 2. Made it into a simplistic interactive command. Tested with VStarcam
1 parent 1cf4cee commit a5f3f20

File tree

1 file changed

+124
-51
lines changed

1 file changed

+124
-51
lines changed

examples/continuous_move.py

Lines changed: 124 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,100 @@
1-
from time import sleep
2-
1+
import asyncio, sys
32
from onvif import ONVIFCamera
43

4+
IP="192.168.0.100" # Camera IP address
5+
PORT=10080 # Port
6+
USER="admin" # Username
7+
PASS="password" # Password
8+
9+
510
XMAX = 1
611
XMIN = -1
712
YMAX = 1
813
YMIN = -1
14+
moverequest = None
15+
ptz = None
16+
active = False
917

10-
def perform_move(ptz, request, timeout):
18+
def do_move(ptz, request):
1119
# Start continuous move
20+
global active
21+
if active:
22+
ptz.Stop({'ProfileToken': request.ProfileToken})
23+
active = True
1224
ptz.ContinuousMove(request)
13-
# Wait a certain time
14-
sleep(timeout)
15-
# Stop continuous move
16-
ptz.Stop({'ProfileToken': request.ProfileToken})
17-
18-
def move_up(ptz, request, timeout=1):
19-
print 'move up...'
20-
request.Velocity.PanTilt._x = 0
21-
request.Velocity.PanTilt._y = YMAX
22-
perform_move(ptz, request, timeout)
23-
24-
def move_down(ptz, request, timeout=1):
25-
print 'move down...'
26-
request.Velocity.PanTilt._x = 0
27-
request.Velocity.PanTilt._y = YMIN
28-
perform_move(ptz, request, timeout)
29-
30-
def move_right(ptz, request, timeout=1):
31-
print 'move right...'
32-
request.Velocity.PanTilt._x = XMAX
33-
request.Velocity.PanTilt._y = 0
34-
perform_move(ptz, request, timeout)
35-
36-
def move_left(ptz, request, timeout=1):
37-
print 'move left...'
38-
request.Velocity.PanTilt._x = XMIN
39-
request.Velocity.PanTilt._y = 0
40-
perform_move(ptz, request, timeout)
41-
42-
def continuous_move():
43-
mycam = ONVIFCamera('192.168.0.112', 80, 'admin', '12345')
25+
26+
def move_up(ptz, request):
27+
print ('move up...')
28+
request.Velocity.PanTilt.x = 0
29+
request.Velocity.PanTilt.y = YMAX
30+
do_move(ptz, request)
31+
32+
def move_down(ptz, request):
33+
print ('move down...')
34+
request.Velocity.PanTilt.x = 0
35+
request.Velocity.PanTilt.y = YMIN
36+
do_move(ptz, request)
37+
38+
def move_right(ptz, request):
39+
print ('move right...')
40+
request.Velocity.PanTilt.x = XMAX
41+
request.Velocity.PanTilt.y = 0
42+
do_move(ptz, request)
43+
44+
def move_left(ptz, request):
45+
print ('move left...')
46+
request.Velocity.PanTilt.x = XMIN
47+
request.Velocity.PanTilt.y = 0
48+
do_move(ptz, request)
49+
50+
51+
def move_upleft(ptz, request):
52+
print ('move up left...')
53+
request.Velocity.PanTilt.x = XMIN
54+
request.Velocity.PanTilt.y = YMAX
55+
do_move(ptz, request)
56+
57+
def move_upright(ptz, request):
58+
print ('move up left...')
59+
request.Velocity.PanTilt.x = XMAX
60+
request.Velocity.PanTilt.y = YMAX
61+
do_move(ptz, request)
62+
63+
def move_downleft(ptz, request):
64+
print ('move down left...')
65+
request.Velocity.PanTilt.x = XMIN
66+
request.Velocity.PanTilt.y = YMIN
67+
do_move(ptz, request)
68+
69+
def move_downright(ptz, request):
70+
print ('move down left...')
71+
request.Velocity.PanTilt.x = XMAX
72+
request.Velocity.PanTilt.y = YMIN
73+
do_move(ptz, request)
74+
75+
def setup_move():
76+
mycam = ONVIFCamera(IP, PORT, USER, PASS)
4477
# Create media service object
4578
media = mycam.create_media_service()
79+
4680
# Create ptz service object
81+
global ptz
4782
ptz = mycam.create_ptz_service()
4883

4984
# Get target profile
50-
media_profile = media.GetProfiles()[0];
85+
media_profile = media.GetProfiles()[0]
5186

5287
# Get PTZ configuration options for getting continuous move range
5388
request = ptz.create_type('GetConfigurationOptions')
54-
request.ConfigurationToken = media_profile.PTZConfiguration._token
89+
request.ConfigurationToken = media_profile.PTZConfiguration.token
5590
ptz_configuration_options = ptz.GetConfigurationOptions(request)
5691

57-
request = ptz.create_type('ContinuousMove')
58-
request.ProfileToken = media_profile._token
92+
global moverequest
93+
moverequest = ptz.create_type('ContinuousMove')
94+
moverequest.ProfileToken = media_profile.token
95+
if moverequest.Velocity is None:
96+
moverequest.Velocity = ptz.GetStatus({'ProfileToken': media_profile.token}).Position
5997

60-
ptz.Stop({'ProfileToken': media_profile._token})
6198

6299
# Get range of pan and tilt
63100
# NOTE: X and Y are velocity vector
@@ -67,17 +104,53 @@ def continuous_move():
67104
YMAX = ptz_configuration_options.Spaces.ContinuousPanTiltVelocitySpace[0].YRange.Max
68105
YMIN = ptz_configuration_options.Spaces.ContinuousPanTiltVelocitySpace[0].YRange.Min
69106

70-
# move right
71-
move_right(ptz, request)
72-
73-
# move left
74-
move_left(ptz, request)
75-
76-
# Move up
77-
move_up(ptz, request)
78-
79-
# move down
80-
move_down(ptz, request)
81107

108+
def readin():
109+
"""Reading from stdin and displaying menu"""
110+
global moverequest, ptz
111+
112+
selection = sys.stdin.readline().strip("\n")
113+
lov=[ x for x in selection.split(" ") if x != ""]
114+
if lov:
115+
116+
if lov[0].lower() in ["u","up"]:
117+
move_up(ptz,moverequest)
118+
elif lov[0].lower() in ["d","do","dow","down"]:
119+
move_down(ptz,moverequest)
120+
elif lov[0].lower() in ["l","le","lef","left"]:
121+
move_left(ptz,moverequest)
122+
elif lov[0].lower() in ["l","le","lef","left"]:
123+
move_left(ptz,moverequest)
124+
elif lov[0].lower() in ["r","ri","rig","righ","right"]:
125+
move_right(ptz,moverequest)
126+
elif lov[0].lower() in ["ul"]:
127+
move_upleft(ptz,moverequest)
128+
elif lov[0].lower() in ["ur"]:
129+
move_upright(ptz,moverequest)
130+
elif lov[0].lower() in ["dl"]:
131+
move_downleft(ptz,moverequest)
132+
elif lov[0].lower() in ["dr"]:
133+
move_downright(ptz,moverequest)
134+
elif lov[0].lower() in ["s","st","sto","stop"]:
135+
ptz.Stop({'ProfileToken': moverequest.ProfileToken})
136+
active = False
137+
else:
138+
print("What are you asking?\tI only know, 'up','down','left','right', 'ul' (up left), \n\t\t\t'ur' (up right), 'dl' (down left), 'dr' (down right) and 'stop'")
139+
140+
print("")
141+
print("Your command: ", end='',flush=True)
142+
143+
82144
if __name__ == '__main__':
83-
continuous_move()
145+
setup_move()
146+
loop = asyncio.get_event_loop()
147+
try:
148+
loop.add_reader(sys.stdin,readin)
149+
print("Use Ctrl-C to quit")
150+
print("Your command: ", end='',flush=True)
151+
loop.run_forever()
152+
except:
153+
pass
154+
finally:
155+
loop.remove_reader(sys.stdin)
156+
loop.close()

0 commit comments

Comments
 (0)