| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #!/usr/bin/env python3
- import paho.mqtt.client as mqtt
- import threading
- from time import sleep
- from os import path
- # The callback for when the client receives a CONNACK response from the server.
- def on_connect(client, userdata, flags, rc):
- print("Connected with result code "+str(rc))
- # Subscribing in on_connect() means that if we lose the connection and
- # reconnect then subscriptions will be renewed.
- client.subscribe("video/servo1/#")
- # The callback for when a PUBLISH message is received from the server.
- def on_message(client, userdata, msg):
- print(msg.topic+" "+str(msg.payload))
- if msg.topic == "video/servo1/restart":
- restart_servos()
- if msg.topic == "video/servo1/rotate":
- servo_arg = msg.payload.split()[0]
- try:
- offset = int(msg.payload.split()[1])
- except:
- return
- servo = -1
- if servo_arg.lower() == "x":
- servo = 1
- if servo_arg.lower() == "y":
- servo = 0
- if servo == -1:
- print("Servo invalido")
- return
- update_servo(servo, offset)
- client = mqtt.Client()
- client.on_connect = on_connect
- client.on_message = on_message
- client.connect("192.168.2.123", 1883, 60)
- def update_servo(servo, offset):
- filename = "/tmp/servo_%s" % servo
- old_val = ""
- if path.isfile(filename):
- valfile = open(filename, "r+")
- old_val = valfile.read()
- else:
- valfile = open(filename, "w")
- try:
- old_val = int(old_val)
- except:
- print("Can't convert. Defaulting")
- old_val = 1500
- print(old_val)
- valfile.seek(0)
- new_val = old_val+offset
- new_val = min(max(new_val, 900), 1750)
- print(new_val, file=valfile)
- print(new_val)
- steps = int(abs(new_val-old_val)/10)
- if steps == 0:
- exit(0)
- delta = int(offset/steps)
- if delta > 0:
- delta = "+%d" % delta
- servoblaster = open("/dev/servoblaster", "w")
- for _ in range(0, steps):
- # print("%d=%sus" % ( servo, delta ))
- print("%d=%sus" % (servo, delta), file=servoblaster)
- servoblaster.flush()
- sleep(0.12)
- def restart_servos():
- servoblaster = open("/dev/servoblaster", "w")
- minv = 900
- maxv = 1750
- servo = 0
- percentage = 66
- filename = "/tmp/servo_%d" % servo
- print("%d=%d%%" % (servo, percentage), file=servoblaster)
- print(int((maxv-minv) * (percentage/100))+minv, file=open(filename, "w"))
- servo = 1
- percentage = 61
- filename = "/tmp/servo_%d" % servo
- print("%d=%d%%" % (servo, percentage), file=servoblaster)
- print(int((maxv-minv) * (percentage/100))+minv, file=open(filename, "w"))
- servoblaster.flush()
- servoblaster.close()
- t = threading.Thread(target=client.loop_forever)
- t.start()
- t.join()
|