import stupid_artnet.StupidArtnet as artnet import time import yaml import argparse from voluptuous import Schema, Required import random from dataclasses import dataclass CONFIG_SCHEME = Schema( { Required('target'): str, Required('universe'): int, Required('min_sleep'): float, Required('max_sleep'): float, Required('positions'): list } ) COLORS = {'red': 40, 'green': 80, 'yellow': 1, "pattern": 120, "magic": 160} @dataclass(frozen=True) class Cloud: x: int y: int color: str def laser_on(artnet): artnet.set_single_value(10, 0) artnet.show() def laser_off(artnet): artnet.set_single_value(10, 17) artnet.show() def set_mode(artnet, mode): artnet.set_single_value(1, mode) def set_color(artnet, color): artnet.set_single_value(8, color) def set_pos(artnet, pos): artnet.set_single_value(5, pos[0]) artnet.set_single_value(6, pos[1]) def intTryParse(value): try: return int(value), True except ValueError: return value, False def load_config(config_path): with open(config_path, "r") as f: data = yaml.safe_load(f) # validate config CONFIG_SCHEME(data) positions = list() for p in data['positions']: positions.append(Cloud(x = p['x'], y = p['y'], color=p['color'])) data['positions'] = positions return data def interactive(an, config): import keyboard x = 0 y = 0 set_color(an, 0x100) while True: if keyboard.is_pressed("w"): x = x + 1 if keyboard.is_pressed("s"): x = x - 1 if keyboard.is_pressed("a"): y = y - 1 if keyboard.is_pressed("d"): y = y + 1 set_pos(an, (x, y)) time.sleep(0.05) def main(args): config = load_config(args.config) # setup laser an = artnet.StupidArtnet(targetIP=config['target'], universe = config['universe']) an.start() set_mode(an, 0xFF) if args.interactive: interactive(an, config) positions = config['positions'] # loop through colors while True: p = random.choice(positions) # exclude current position from next choises positions = list(set(config['positions']) - set([p])) # set position and choose color set_pos(an, (p.x, p.y)) if p.color == 'random': c = random.choice(list(COLORS.values())) else: c = COLORS.get(p.color) set_color(an, c) # wait random amount of times sleep_time = config['min_sleep'] + (config['max_sleep'] - config['min_sleep']) * random.uniform(0, 1) time.sleep(sleep_time) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--config") parser.add_argument("--interactive", action="store_true") args = parser.parse_args() main(args)