Moved vibration code into a class

miband5_dev
NateSchoolfield 2021-02-05 17:14:25 -08:00
parent f1b9497f0d
commit bca9e148fa
2 changed files with 128 additions and 125 deletions

View File

@ -3,7 +3,9 @@
import time, re, threading import time, re, threading
from bluepy.btle import BTLEDisconnectError from bluepy.btle import BTLEDisconnectError
from miband import miband from miband import miband
import sleepdata, vibrate import sleepdata
from vibrate import Vibrate
@ -13,7 +15,7 @@ mac_filename = 'mac.txt'
maximize_graph = False maximize_graph = False
vibration_settings = { vibration_settings = {
'interval_minutes': 45, 'interval_minutes': 0.1,
'duration_seconds': 5, 'duration_seconds': 5,
'type': 'random' 'type': 'random'
} }
@ -91,7 +93,6 @@ def connect():
try: try:
band = miband(MAC_ADDR, AUTH_KEY, debug=True) band = miband(MAC_ADDR, AUTH_KEY, debug=True)
success = band.initialize() success = band.initialize()
vibrate.band = band
except BTLEDisconnectError: except BTLEDisconnectError:
print(msg.format(timeout)) print(msg.format(timeout))
time.sleep(timeout) time.sleep(timeout)
@ -112,7 +113,7 @@ def start_data_pull():
def start_vibration(): def start_vibration():
while True: while True:
try: try:
vibrate.timed_vibration(vibration_settings) vibration.timed_vibration(vibration_settings)
except BTLEDisconnectError: except BTLEDisconnectError:
print("Vibration thread waiting for band reconnect...") print("Vibration thread waiting for band reconnect...")
time.sleep(1) time.sleep(1)
@ -120,6 +121,7 @@ def start_vibration():
if __name__ == "__main__": if __name__ == "__main__":
connect() connect()
vibration = Vibrate(band)
threading.Thread(target=start_data_pull).start() threading.Thread(target=start_data_pull).start()
threading.Thread(target=start_vibration).start() threading.Thread(target=start_vibration).start()
sleepdata.init_graph(maximize=maximize_graph, graph_displaytime_mins=5) sleepdata.init_graph(maximize=maximize_graph, graph_displaytime_mins=5)

View File

@ -2,8 +2,6 @@ import time
import random import random
import logging import logging
band = None
# Notes: # Notes:
# The miband4 does not (seem to) support different vibration intensities, rather the values sent (2-255) # The miband4 does not (seem to) support different vibration intensities, rather the values sent (2-255)
# represent how long the vibration motor runs. A value of 30 roughly corresponds to 60ms of motor run time. # represent how long the vibration motor runs. A value of 30 roughly corresponds to 60ms of motor run time.
@ -11,17 +9,20 @@ band = None
# Currently "continuous" mode doesn't work, as it doesn't turn off. # Currently "continuous" mode doesn't work, as it doesn't turn off.
# This will be fixed shortly. # This will be fixed shortly.
class Vibrate():
vibrate_band = None
vibration_log = None
def __init__(self, band):
self.vibrate_band = band
if __name__ == 'vibrate':
FORMAT = '%(asctime)-15s %(name)s (%(levelname)s) > %(message)s' FORMAT = '%(asctime)-15s %(name)s (%(levelname)s) > %(message)s'
logging.basicConfig(format=FORMAT) logging.basicConfig(format=FORMAT)
vibration_log_level = logging.INFO vibration_log_level = logging.INFO
vibration_log = logging.getLogger(__name__) self.vibration_log = logging.getLogger(__name__)
vibration_log.setLevel(vibration_log_level) self.vibration_log.setLevel(vibration_log_level)
def timed_vibration(self, settings):
def timed_vibration(settings):
interval_minutes = settings['interval_minutes'] interval_minutes = settings['interval_minutes']
duration_seconds = settings['duration_seconds'] duration_seconds = settings['duration_seconds']
type = settings['type'] type = settings['type']
@ -30,11 +31,11 @@ def timed_vibration(settings):
tick_time = time.time() tick_time = time.time()
buzz_delay = interval_minutes * 60 buzz_delay = interval_minutes * 60
vibration_log.info("Starting vibration timer: {} minutes".format(interval_minutes)) self.vibration_log.info("Starting vibration timer: {} minutes".format(interval_minutes))
if type not in ['random', 'pattern', 'rolling', 'continuous']: if type not in ['random', 'pattern', 'rolling', 'continuous']:
vibration_log.warn("Invalid or no vibration type specified: {}".format(type)) self.vibration_log.warn("Invalid or no vibration type specified: {}".format(type))
vibration_log.warn("Must be one of these: random, pattern, rolling, continuous") self.vibration_log.warn("Must be one of these: random, pattern, rolling, continuous")
return return
while True: while True:
@ -42,13 +43,13 @@ def timed_vibration(settings):
if elapsed_time >= buzz_delay: if elapsed_time >= buzz_delay:
print("Buzz timer expired, buzzing") print("Buzz timer expired, buzzing")
if type == 'random': if type == 'random':
vibrate_random(duration_seconds) self.vibrate_random(duration_seconds)
elif type == 'pattern': elif type == 'pattern':
vibrate_pattern(duration_seconds) self.vibrate_pattern(duration_seconds)
elif type == 'rolling': elif type == 'rolling':
vibrate_rolling(duration_seconds) self.vibrate_rolling(duration_seconds)
elif type == 'continuous': elif type == 'continuous':
vibrate_continuous(duration_seconds) self.vibrate_continuous(duration_seconds)
buzz_timer = tick_time buzz_timer = tick_time
else: else:
@ -56,7 +57,7 @@ def timed_vibration(settings):
time.sleep(0.5) time.sleep(0.5)
def generate_random_vibration_pattern(pulse_count): def generate_random_vibration_pattern(self, pulse_count):
#pulse_duration_range and pulse_interval_range_ms are arbitrary #pulse_duration_range and pulse_interval_range_ms are arbitrary
pulse_duration_range = { pulse_duration_range = {
'low': 80, 'low': 80,
@ -75,18 +76,18 @@ def generate_random_vibration_pattern(pulse_count):
return output_pulse_pattern return output_pulse_pattern
def vibrate_random(duration_seconds): def vibrate_random(self, duration_seconds):
print("Sending random vibration...") print("Sending random vibration...")
duration_start = time.time() duration_start = time.time()
pattern_length = 20 #This value is arbitrary pattern_length = 20 #This value is arbitrary
pulse_pattern = generate_random_vibration_pattern(pattern_length) pulse_pattern = self.generate_random_vibration_pattern(pattern_length)
while True: while True:
if (time.time() - duration_start) >= duration_seconds: if (time.time() - duration_start) >= duration_seconds:
print ("Stopping vibration") print ("Stopping vibration")
band.vibrate(0) self.vibrate_band.vibrate(0)
break break
else: else:
for pattern in pulse_pattern: for pattern in pulse_pattern:
@ -94,11 +95,11 @@ def vibrate_random(duration_seconds):
break break
vibrate_ms = pattern[0] vibrate_ms = pattern[0]
vibro_delay = pattern[1] vibro_delay = pattern[1]
band.vibrate(vibrate_ms) self.vibrate_band.vibrate(vibrate_ms)
time.sleep(vibro_delay) time.sleep(vibro_delay)
def vibrate_pattern(duration_seconds): def vibrate_pattern(self, duration_seconds):
print("Sending vibration...") print("Sending vibration...")
duration_start = time.time() duration_start = time.time()
@ -108,7 +109,7 @@ def vibrate_pattern(duration_seconds):
while True: while True:
if (time.time() - duration_start) >= duration_seconds: if (time.time() - duration_start) >= duration_seconds:
print ("Stopping vibration") print ("Stopping vibration")
band.vibrate(0) self.vibrate_band.vibrate(0)
break break
else: else:
for pattern in pulse_pattern: for pattern in pulse_pattern:
@ -116,11 +117,11 @@ def vibrate_pattern(duration_seconds):
break break
vibrate_ms = pattern[0] vibrate_ms = pattern[0]
vibro_delay = pattern[1] vibro_delay = pattern[1]
band.vibrate(vibrate_ms) self.vibrate_band.vibrate(vibrate_ms)
time.sleep(vibro_delay) time.sleep(vibro_delay)
def vibrate_rolling(duration_seconds): def vibrate_rolling(self, duration_seconds):
print("Sending rolling vibration...") print("Sending rolling vibration...")
duration_start = time.time() duration_start = time.time()
@ -128,16 +129,16 @@ def vibrate_rolling(duration_seconds):
while True: while True:
if (time.time() - duration_start) >= duration_seconds: if (time.time() - duration_start) >= duration_seconds:
print ("Stopping vibration") print ("Stopping vibration")
band.vibrate(0) self.vibrate_band.vibrate(0)
break break
else: else:
for x in range(10): for x in range(10):
for x in range(20, 40, 1): for x in range(20, 40, 1):
band.vibrate(x) self.vibrate_band.vibrate(x)
for x in range(40, 20, -1): for x in range(40, 20, -1):
band.vibrate(x) self.vibrate_band.vibrate(x)
def vibrate_continuous(duration_seconds): def vibrate_continuous(self, duration_seconds):
#Currently broken, still working on this bit. #Currently broken, still working on this bit.
print("Sending continuous vibration...") print("Sending continuous vibration...")
@ -146,7 +147,7 @@ def vibrate_continuous(duration_seconds):
while True: while True:
if (time.time() - duration_start) >= duration_seconds: if (time.time() - duration_start) >= duration_seconds:
print ("Stopping vibration") print ("Stopping vibration")
band.vibrate(0) self.vibrate_band.vibrate(0)
break break
else: else:
band.vibrate(1) self.vibrate_band.vibrate(1)