| … | … | @@ -19,7 +19,7 @@ try: |
| 19 | 19 | interval = .03 #seconds |
| 20 | 20 | maxpwm = 65535 |
| 21 | 21 | minpwm = 2000 |
| 22 | inc = 1000 | |
| 22 | inc = 100 | |
| 23 | 23 | i = minpwm |
| 24 | 24 | while i<=maxpwm: |
| 25 | 25 | for sock in sockets: |
| … | … | @@ -1,9 +1,11 @@ |
| 1 | 1 | config = { |
| 2 | 2 | 'LightArms': [ |
| 3 | {'address':'10.0.0.167', 'numChannels':12}, | |
| 3 | #{'address':'10.0.0.167', 'numChannels':12}, | |
| 4 | 4 | |
| 5 | 5 | # this is how you would define a light arm |
| 6 | #{'address':'10.0.0.161', 'numChannels':3, 'numServos':2, 'inversions':[False, False]} | |
| 6 | {'address':'10.0.0.30', 'numChannels':12, 'numServos':2, 'inversions':[False, False]}, | |
| 7 | {'address':'10.0.0.31', 'numChannels':12, 'numServos':2, 'inversions':[False, False]}, | |
| 8 | {'address':'10.0.0.63', 'numChannels':12, 'numServos':2, 'inversions':[False, False]}, | |
| 7 | 9 | ], |
| 8 | 10 | |
| 9 | 11 | 'DMX': {'universes': [1]}, |
| … | … | @@ -15,9 +15,9 @@ We unfortunately use the word 'cue' in two different ways: |
| 15 | 15 | import sys, os, threading, ast, time, subprocess, random |
| 16 | 16 | from console import * |
| 17 | 17 | from lightarm import Arms |
| 18 | from dmx import DMX | |
| 18 | #from dmx import DMX | |
| 19 | 19 | from pivideo import Video |
| 20 | #from prinboo import Prinboo | |
| 20 | from prinboo import Prinboo | |
| 21 | 21 | |
| 22 | 22 | ######################################################################################################### |
| 23 | 23 | # helpers |
| … | … | @@ -202,7 +202,7 @@ class CueFade(CueLoad): |
| 202 | 202 | |
| 203 | 203 | # called by the thread created in run() |
| 204 | 204 | def __call__(self): |
| 205 | timestep = 1/30.0 | |
| 205 | timestep = 1/35.0 | |
| 206 | 206 | printPeriodPeriod = .25 |
| 207 | 207 | printPeriodTimestepCount = printPeriodPeriod / timestep |
| 208 | 208 | startTime = time.time() |
| … | … | @@ -323,6 +323,7 @@ class CuePrinboo(CueLoad): |
| 323 | 323 | |
| 324 | 324 | timestep = 1. / self.framerate |
| 325 | 325 | vel = 1 |
| 326 | if self.line == 'left' or self.line == 'right': vel = 5 | |
| 326 | 327 | |
| 327 | 328 | # Signal the previous thread to exit, and hand it to the next threadV |
| 328 | 329 | # so it can wait. |
| … | … | @@ -338,7 +339,7 @@ class PrinbooLimbsThread(threading.Thread): |
| 338 | 339 | self.prevThread = prevThread |
| 339 | 340 | if isinstance(poses, dict): poses = [poses] # convert one frame into a list of frames |
| 340 | 341 | self.poses = poses |
| 341 | self.vel = 5#vel | |
| 342 | self.vel = vel | |
| 342 | 343 | self.timestep = .05#timestep |
| 343 | 344 | |
| 344 | 345 | self.shouldExit = False |
| … | … | @@ -359,7 +360,7 @@ class PrinbooLimbsThread(threading.Thread): |
| 359 | 360 | #endTime = startTime + self.period |
| 360 | 361 | nextTime = startTime + self.timestep |
| 361 | 362 | |
| 362 | NumIds = 2 | |
| 363 | NumIds = 9 | |
| 363 | 364 | |
| 364 | 365 | def popRandom(li): |
| 365 | 366 | i = random.randint(0, len(li)-1) |
| … | … | @@ -448,17 +449,46 @@ class PrinbooLimbsThread(threading.Thread): |
| 448 | 449 | # time.sleep(nextTime - time.time()) |
| 449 | 450 | |
| 450 | 451 | |
| 451 | class CueVideo(CueLoad): | |
| 452 | """Play a video by running a shell command""" | |
| 452 | class CueRemoteVideo(CueLoad): | |
| 453 | """Play a video by running a shell command to communicate with omxd""" | |
| 453 | 454 | |
| 454 | player = "/usr/bin/omxplayer" | |
| 455 | #player = "/usr/bin/omxplayer" | |
| 455 | 456 | |
| 456 | 457 | def __init__(self, line): |
| 457 | 458 | CueLoad.__init__(self, line) |
| 459 | tokens = line.split() | |
| 460 | if len(tokens) < 3: | |
| 461 | raise BaseException('needs IP address and filename') | |
| 462 | ||
| 463 | self.address = tokens[1] | |
| 464 | self.filename = restAfterWord(tokens[1], line) | |
| 465 | ||
| 466 | def load(self): | |
| 467 | pass #maybe check file exists | |
| 468 | def run(self, immediate=False): | |
| 469 | Video.playVideo(self.filename, self.address) | |
| 470 | ||
| 471 | class CueLocalVideo(CueLoad): | |
| 472 | """Play a video by running VLC""" | |
| 473 | ||
| 474 | player = 'vlc' | |
| 475 | headless = '--qt-start-minimized' | |
| 476 | ||
| 477 | def __init__(self, line): | |
| 478 | CueLoad.__init__(self, line) | |
| 479 | tokens = line.split() | |
| 480 | if len(tokens) < 2: | |
| 481 | raise BaseException('needs filename') | |
| 482 | ||
| 483 | self.filename = restAfterWord(tokens[0], line) | |
| 484 | ||
| 458 | 485 | def load(self): |
| 459 | 486 | pass #maybe check file exists |
| 460 | 487 | def run(self, immediate=False): |
| 461 | Video.playVideo(self.filename) | |
| 488 | if Video.VlcProcess: | |
| 489 | Video.VlcProcess.kill() | |
| 490 | if self.filename != 'off': | |
| 491 | Video.VlcProcess = subprocess.Popen([self.player, self.headless, self.filename]) | |
| 462 | 492 | |
| 463 | 493 | def cmdCue(line, CueClass): |
| 464 | 494 | """instantiate a type of cue and run it immediately""" |
| … | … | @@ -486,9 +516,7 @@ def cmdSave(tokens, line): |
| 486 | 516 | text += ",\n 'DMX': " + str(DMX.get()) |
| 487 | 517 | except: pass |
| 488 | 518 | |
| 489 | try: | |
| 490 | text += ",\n 'Limbs': " + str(Prinboo.limbs) | |
| 491 | except: pass | |
| 519 | text += ",\n 'Limbs': " + str(Prinboo.limbs) | |
| 492 | 520 | |
| 493 | 521 | text += "\n}\n" |
| 494 | 522 | #text = "{\n 'version': 0,\n 'DMX': " + dmx + ",\n 'LightArm': {\n 'Servos': " + str(ucServos) + ",\n 'LEDs': " + str(ucLEDs) + "\n }\n}" |
| … | … | @@ -506,7 +534,8 @@ def cmdSave(tokens, line): |
| 506 | 534 | CueClassMap = { |
| 507 | 535 | 'load':CueLoad, |
| 508 | 536 | 'fade':CueFade, |
| 509 | #'limbs':CuePrinboo, | |
| 510 | #'c':CuePrinboo, | |
| 511 | 'video':CueVideo, | |
| 537 | 'limbs':CuePrinboo, | |
| 538 | 'c':CuePrinboo, | |
| 539 | 'video':CueRemoteVideo, | |
| 540 | 'audio':CueLocalVideo, | |
| 512 | 541 | } |
| … | … | @@ -15,9 +15,7 @@ TODO: |
| 15 | 15 | |
| 16 | 16 | """ |
| 17 | 17 | |
| 18 | ||
| 19 | ||
| 20 | import sys, os, os.path, threading, ast, time, signal | |
| 18 | import sys, os, os.path, threading, ast, time, signal, paramiko | |
| 21 | 19 | from console import * |
| 22 | 20 | from cue import * |
| 23 | 21 | from cueengine import CueEngine |
| … | … | @@ -28,11 +26,12 @@ CuesFilename = 'cuesheet.txt' #initial cuesheet automatically loaded |
| 28 | 26 | |
| 29 | 27 | CueMgr = CueEngine() |
| 30 | 28 | |
| 31 | #try: | |
| 32 | # from prinboo import Prinboo | |
| 33 | #except ImportError: | |
| 34 | Prinboo = None | |
| 35 | # print('No Prinboo') | |
| 29 | #Prinboo = None | |
| 30 | try: | |
| 31 | from prinboo import Prinboo | |
| 32 | except (ImportError, paramiko.ssh_exception.NoValidConnectionsError) as e: | |
| 33 | Prinboo = None | |
| 34 | print('No Prinboo') | |
| 36 | 35 | |
| 37 | 36 | try: |
| 38 | 37 | from pivideo import Video |
| … | … | @@ -45,10 +44,10 @@ except ImportError: |
| 45 | 44 | Arms = None |
| 46 | 45 | print('No LightArms') |
| 47 | 46 | |
| 48 | try: from dmx import DMX | |
| 49 | except KeyError: | |
| 50 | DMX = None | |
| 51 | print('No DMX') | |
| 47 | #try: from dmx import DMX | |
| 48 | #except: | |
| 49 | DMX = None | |
| 50 | print('No DMX') | |
| 52 | 51 | |
| 53 | 52 | # call initialize outside of try-except to show errors to user |
| 54 | 53 | if Arms: Arms.initialize(config) |
| … | … | @@ -97,7 +96,7 @@ class LightArmView(View): |
| 97 | 96 | self.ixCursor = 0 |
| 98 | 97 | self.iyCursor = 0 |
| 99 | 98 | |
| 100 | self.inc = LinearStateMachine([1, 5, 20]) | |
| 99 | self.inc = LinearStateMachine([1, 5, 20, 100, 1000]) | |
| 101 | 100 | |
| 102 | 101 | # map names to servo vector indices |
| 103 | 102 | ServoDims = {'x':1, 'y':0} |
| … | … | @@ -155,7 +154,7 @@ class LightArmView(View): |
| 155 | 154 | |
| 156 | 155 | # add increment to the intensity of the currently selected arm(s) |
| 157 | 156 | def modI(self, inc, channel): |
| 158 | #print('ids:', self.selected()) | |
| 157 | print('ids:', self.selected()) | |
| 159 | 158 | for id in self.selected(): |
| 160 | 159 | try: v = Arms.getChannel(id, channel) |
| 161 | 160 | except IndexError: return |
| … | … | @@ -170,10 +169,8 @@ class LightArmView(View): |
| 170 | 169 | ch = ch.lower() |
| 171 | 170 | if ch == 'x': |
| 172 | 171 | self.toggleMode() |
| 173 | if ch == 'q': | |
| 172 | elif ch == 'q': | |
| 174 | 173 | for id in self.selected(): Arms.relax(id) |
| 175 | if ch == '0': | |
| 176 | pass #Arms.setAngles(self.selected(), [Arms.ServoCenter] * len(self.ServoDims)) | |
| 177 | 174 | elif ch == 'w': |
| 178 | 175 | self.modAngle('y', self.inc()) |
| 179 | 176 | elif ch == 's': |
| … | … | @@ -229,23 +226,23 @@ class LightArmView(View): |
| 229 | 226 | |
| 230 | 227 | if self.inSingleMode(): |
| 231 | 228 | for i in range(numArms): |
| 232 | if i == self.ixCursor: print('===|', end='') | |
| 233 | else: print('---|', end='') | |
| 229 | if i == self.ixCursor: print('=====|', end='') | |
| 230 | else: print('-----|', end='') | |
| 234 | 231 | else: |
| 235 | 232 | for i in range(numArms): |
| 236 | 233 | if self.inGroup(i): |
| 237 | if self.inGroup(i+1, i): print('====', end='') | |
| 238 | else: print('===|', end='') | |
| 239 | else: print('---|', end='') | |
| 234 | if self.inGroup(i+1, i): print('======', end='') | |
| 235 | else: print('=====|', end='') | |
| 236 | else: print('-----|', end='') | |
| 240 | 237 | print('') |
| 241 | 238 | |
| 242 | 239 | def printAngle(dim, index): |
| 243 | 240 | try: |
| 244 | 241 | angle = self.getAngle(dim, index) |
| 245 | if angle < 1: print('XXX|', end='') | |
| 246 | else: print('{0:^3}|'.format(angle), end='') | |
| 242 | if angle < 1: print('XXXXX|', end='') | |
| 243 | else: print('{0:^5}|'.format(angle), end='') | |
| 247 | 244 | except: |
| 248 | print('---|', end='') | |
| 245 | print('-----|', end='') | |
| 249 | 246 | |
| 250 | 247 | print(' Light Arm View') |
| 251 | 248 | printHSep(False) |
| … | … | @@ -272,7 +269,7 @@ class LightArmView(View): |
| 272 | 269 | for channel in range(Arms.MaxChannels): |
| 273 | 270 | print(names[channel] + ': |', end='') |
| 274 | 271 | for i in range(numArms): |
| 275 | try: print('{0:^3}|'.format(Arms.getChannel(i, channel)), end='') | |
| 272 | try: print('{0:^5}|'.format(Arms.getChannel(i, channel)), end='') | |
| 276 | 273 | except: print('---|', end='') |
| 277 | 274 | print('') |
| 278 | 275 | printHSep(channel+1 != Arms.MaxChannels) |
| … | … | @@ -548,27 +545,25 @@ class CueView(View): |
| 548 | 545 | elif ch == ',' or ch == '<': |
| 549 | 546 | CueMgr.prevScene() |
| 550 | 547 | |
| 551 | # # Prinboo live controls | |
| 552 | # elif ch == 'w': | |
| 553 | # Prinboo.screen.togglePlayback() | |
| 554 | # elif ch == 'a': | |
| 555 | # Prinboo.motors.incSpeed() | |
| 556 | # elif ch == 'd': | |
| 557 | # Prinboo.motors.decSpeed() | |
| 558 | # elif ch == 's': | |
| 559 | # Prinboo.motors.stop() | |
| 560 | # elif ch == '\x1b': | |
| 561 | # seq = getch() + getch() | |
| 562 | # if seq == '[A': # up arrow | |
| 563 | # Prinboo.motors.forward() | |
| 564 | # elif seq == '[B': # down arrow | |
| 565 | # Prinboo.motors.backward() | |
| 566 | # elif seq == '[C': # left arrow | |
| 567 | # Prinboo.motors.turnLeft() | |
| 568 | # elif seq == '[D': # right arrow | |
| 569 | # Prinboo.motors.turnRight() | |
| 570 | ||
| 571 | ||
| 548 | # Prinboo live controls | |
| 549 | elif ch == 'w': | |
| 550 | Prinboo.screen.togglePlayback() | |
| 551 | elif ch == 'a': | |
| 552 | Prinboo.motors.incSpeed() | |
| 553 | elif ch == 'd': | |
| 554 | Prinboo.motors.decSpeed() | |
| 555 | elif ch == 's': | |
| 556 | Prinboo.motors.stop() | |
| 557 | elif ch == '\x1b': | |
| 558 | seq = getch() + getch() | |
| 559 | if seq == '[A': # up arrow | |
| 560 | Prinboo.motors.forward() | |
| 561 | elif seq == '[B': # down arrow | |
| 562 | Prinboo.motors.backward() | |
| 563 | elif seq == '[C': # left arrow | |
| 564 | Prinboo.motors.turnRight() | |
| 565 | elif seq == '[D': # right arrow | |
| 566 | Prinboo.motors.turnLeft() | |
| 572 | 567 | |
| 573 | 568 | def handleLineInput(self, line): |
| 574 | 569 | pass |
| … | … | @@ -592,9 +587,9 @@ def programExit(): |
| 592 | 587 | |
| 593 | 588 | if __name__ == '__main__': |
| 594 | 589 | if len(sys.argv) > 1 and sys.argv[1] == 'prinboo': |
| 595 | views = [CueView(), LightArms()] | |
| 590 | views = [CueView(), PrinbooView()] | |
| 596 | 591 | else: #default is dmx mode |
| 597 | views = [CueView(), LightArmView()] | |
| 592 | views = [CueView(), LightArmView(), PrinbooView()] | |
| 598 | 593 | if DMX: views.append(SliderView()) |
| 599 | 594 | currentView = views[0] |
| 600 | 595 |
| … | … | @@ -1,12 +1,166 @@ |
| 1 | 1 | scene Start |
| 2 | load off | |
| 2 | seq | |
| 3 | load off | |
| 4 | audio off | |
| 5 | video 10.0.0.162 black | |
| 6 | video 10.0.0.173 black | |
| 7 | scene One | |
| 8 | seq | |
| 9 | audio /home/cayuga/cayuga-lasty/queen.mp3 | |
| 10 | video 10.0.0.162 coco.mp4 | |
| 11 | video 10.0.0.173 coco.mp4 | |
| 12 | fade 5 funeral | |
| 13 | scene fade | |
| 14 | seq | |
| 15 | fade 5 off | |
| 16 | video 10.0.0.162 roses.mp4 | |
| 17 | video 10.0.0.173 roses.mp4 | |
| 18 | audio off | |
| 19 | scene onehalf | |
| 20 | seq | |
| 21 | audio /home/cayuga/cayuga-lasty/c.ogg | |
| 22 | scene Two | |
| 23 | seq | |
| 24 | audio /home/cayuga/cayuga-lasty/waltz.mp3 | |
| 25 | fade temp | |
| 26 | scene fade1 | |
| 27 | seq | |
| 28 | fade 5 off | |
| 29 | video 10.0.0.162 roses.mp4 | |
| 30 | video 10.0.0.173 roses.mp4 | |
| 31 | audio off | |
| 32 | scene three | |
| 33 | seq | |
| 34 | audio /home/cayuga/cayuga-lasty/fly.mp3 | |
| 35 | fade 5 tree | |
| 36 | scene fade2 | |
| 37 | seq | |
| 38 | fade 5 off | |
| 39 | video 10.0.0.162 roses.mp4 | |
| 40 | video 10.0.0.173 roses.mp4 | |
| 41 | audio off | |
| 42 | scene four | |
| 43 | seq | |
| 44 | audio /home/cayuga/cayuga-lasty/crab.mp3 | |
| 45 | scene fade3 | |
| 46 | seq | |
| 47 | fade 5 off | |
| 48 | video 10.0.0.162 roses.mp4 | |
| 49 | video 10.0.0.173 roses.mp4 | |
| 50 | audio off | |
| 51 | scene five | |
| 52 | seq | |
| 53 | audio /home/cayuga/cayuga-lasty/bill.mp3 | |
| 54 | fade 5 aircorn | |
| 55 | scene fade4 | |
| 56 | seq | |
| 57 | fade 5 off | |
| 58 | video 10.0.0.162 roses.mp4 | |
| 59 | video 10.0.0.173 roses.mp4 | |
| 60 | audio off | |
| 61 | scene sixa | |
| 62 | seq | |
| 63 | audio /home/cayuga/cayuga-lasty/seacreature.mp3 | |
| 64 | scene six | |
| 65 | seq | |
| 66 | audio /home/cayuga/cayuga-lasty/fool.mp3 | |
| 67 | fade 5 tealblue | |
| 68 | scene fade5 | |
| 69 | seq | |
| 70 | fade 5 off | |
| 71 | video 10.0.0.162 roses.mp4 | |
| 72 | video 10.0.0.173 roses.mp4 | |
| 73 | audio off | |
| 74 | scene seven | |
| 75 | seq | |
| 76 | audio /home/cayuga/cayuga-lasty/thereis.mp3 | |
| 77 | fade 5 airpurple | |
| 78 | scene fade6 | |
| 79 | seq | |
| 80 | fade 5 off | |
| 81 | audio /home/cayuga/cayuga-lasty/shipdown.mp3 | |
| 82 | video 10.0.0.162 roses.mp4 | |
| 83 | video 10.0.0.173 roses.mp4 | |
| 84 | scene eight | |
| 85 | seq | |
| 86 | audio /home/cayuga/cayuga-lasty/maggie.mp3 | |
| 87 | fade 5 brightcorn | |
| 88 | scene fade7 | |
| 89 | seq | |
| 90 | fade 5 off | |
| 91 | video 10.0.0.162 roses.mp4 | |
| 92 | video 10.0.0.173 roses.mp4 | |
| 93 | audio off | |
| 94 | scene nine | |
| 95 | seq | |
| 96 | audio /home/cayuga/cayuga-lasty/skeleton.mp3 | |
| 97 | fade 5 s-bar | |
| 98 | scene fade8 | |
| 99 | seq | |
| 100 | fade off | |
| 101 | video 10.0.0.162 roses.mp4 | |
| 102 | video 10.0.0.173 roses.mp4 | |
| 103 | audio off | |
| 104 | scene ninehalf | |
| 105 | seq | |
| 106 | audio /home/cayuga/cayuga-lasty/biancaintro.mp3 | |
| 107 | scene ten | |
| 108 | seq | |
| 109 | audio /home/cayuga/cayuga-lasty/printboowaiting.mp3 | |
| 110 | fade 5 sidered | |
| 111 | scene fade9 | |
| 112 | seq | |
| 113 | fade 5 off | |
| 114 | video 10.0.0.162 roses.mp4 | |
| 115 | video 10.0.0.173 roses.mp4 | |
| 116 | audio off | |
| 117 | scene 11 | |
| 118 | seq | |
| 119 | audio /home/cayuga/cayuga-lasty/greg-blue.mp3 | |
| 120 | fade 5 supblue | |
| 121 | scene fade10 | |
| 122 | seq | |
| 123 | fade 5 off | |
| 124 | video 10.0.0.162 roses.mp4 | |
| 125 | video 10.0.0.173 roses.mp4 | |
| 126 | audio off | |
| 127 | scene 12 | |
| 128 | seq | |
| 129 | audio /home/cayuga/cayuga-lasty/letsgetlost.mp3 | |
| 130 | fade 5 aircorn | |
| 131 | scene fade11 | |
| 132 | seq | |
| 133 | fade 5 off | |
| 134 | video 10.0.0.162 roses.mp4 | |
| 135 | video 10.0.0.173 roses.mp4 | |
| 136 | audio off | |
| 137 | scene prefinale | |
| 138 | seq | |
| 139 | audio /home/cayuga/cayuga-lasty/royals.mp3 | |
| 140 | fade 5 brightcorn | |
| 141 | scene fade12 | |
| 142 | seq | |
| 143 | fade 5 off | |
| 144 | audio off | |
| 145 | scene 13 | |
| 146 | seq | |
| 147 | audio /home/cayuga/cayuga-lasty/greglanding.mp3 | |
| 148 | scene 13one | |
| 149 | seq | |
| 150 | audio /home/cayuga/cayuga-lasty/bianca_final.mp3 | |
| 151 | scene 13two | |
| 152 | seq | |
| 153 | audio /home/cayuga/cayuga-lasty/fly.mp3 | |
| 154 | fade 5 tree | |
| 155 | scene fade12 | |
| 156 | seq | |
| 157 | fade 5 off | |
| 158 | video 10.0.0.162 roses.mp4 | |
| 159 | video 10.0.0.173 roses.mp4 | |
| 160 | audio off | |
| 161 | scene finale | |
| 162 | seq | |
| 163 | audio /home/cayuga/cayuga-lasty/castlesburning.mp3 | |
| 164 | fade 5 finale | |
| 3 | 165 | |
| 4 | scene All | |
| 5 | seq | |
| 6 | fade 3 testboth | |
| 7 | video rachshort.mp4 | |
| 8 | 166 | |
| 9 | scene Closing | |
| 10 | seq | |
| 11 | fade 5 off | |
| 12 | video black |
| … | … | @@ -22,7 +22,7 @@ class NetworkArm: |
| 22 | 22 | |
| 23 | 23 | # this class doesn't limit the Channel values |
| 24 | 24 | MinChannelValue = 0 |
| 25 | MaxChannelValue = 999 | |
| 25 | MaxChannelValue = 65534 | |
| 26 | 26 | |
| 27 | 27 | def fitServoRange(v): return max(212, min(812, v)) |
| 28 | 28 | def fitChannelRange(v): return max(0, min(NetworkArm.MaxChannelValue, v)) |
| … | … | @@ -69,10 +69,11 @@ class NetworkArm: |
| 69 | 69 | self.socket.close() |
| 70 | 70 | |
| 71 | 71 | # input range is 0-999 |
| 72 | # output range is 0-65535 | |
| 72 | # output range is 0-65534 | |
| 73 | 73 | def toHighFreq(self, pwm): |
| 74 | 74 | #return int(10535 + pwm / 999 * 55000) |
| 75 | return int(pwm / 999 * 65535) | |
| 75 | #return int(pwm / 999 * 65534) | |
| 76 | return int(pwm) | |
| 76 | 77 | |
| 77 | 78 | def getChannels(self): return list(self.channels) |
| 78 | 79 | def getChannel(self, channel): return self.channels[channel] |
| … | … | @@ -94,6 +95,7 @@ class NetworkArm: |
| 94 | 95 | cmd = 'pwm ' |
| 95 | 96 | for i in self.channels: |
| 96 | 97 | cmd += str(self.toHighFreq(i)) + ' ' |
| 98 | #print(cmd) | |
| 97 | 99 | self.send(cmd) |
| 98 | 100 | |
| 99 | 101 | def relax(self): |
| … | … | @@ -59,16 +59,21 @@ class Screens: |
| 59 | 59 | cls._singleton = object.__new__(cls) |
| 60 | 60 | return cls._singleton |
| 61 | 61 | |
| 62 | def __init__(self): self.screens = None | |
| 62 | def __init__(self): | |
| 63 | self.screens = None | |
| 64 | self.VlcProcess = None | |
| 63 | 65 | |
| 64 | 66 | def initialize(self, configDict): |
| 65 | self.screens = [Screen('10.0.0.19'), Screen('10.0.0.22')] | |
| 67 | self.screens = {} #[Screen('10.0.0.19'), Screen('10.0.0.22')] | |
| 66 | 68 | |
| 67 | def playVideo(self, filename): | |
| 68 | for s in self.screens: s.sendVideoCommand(filename) | |
| 69 | def playVideo(self, filename, targetIp): | |
| 70 | if not self.screens.get(targetIp): | |
| 71 | self.screens[targetIp] = Screen(targetIp) | |
| 72 | ||
| 73 | self.screens[targetIp].sendVideoCommand(filename) | |
| 69 | 74 | |
| 70 | 75 | def exit(self): |
| 71 | for s in self.screens: s.exit() | |
| 76 | for address,s in self.screens.items(): s.exit() | |
| 72 | 77 | |
| 73 | 78 | Video = Screens() |
| 74 | 79 |
| … | … | @@ -124,7 +124,7 @@ class Screen: |
| 124 | 124 | ssh = paramiko.SSHClient() |
| 125 | 125 | self.ssh = ssh |
| 126 | 126 | ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) |
| 127 | ssh.connect(address, username='pi', password='tankgirl') | |
| 127 | ssh.connect(address, username='pi', password='raspberry') | |
| 128 | 128 | # start playing immediately |
| 129 | 129 | self.play('~/cthuloid/ghettopticon/blender/prinboo-talking.mp4') |
| 130 | 130 | #except paramiko.ssh_exception.NoValidConnectionsError: |
| … | … | @@ -148,7 +148,7 @@ class Screen: |
| 148 | 148 | self.stdin.write('q') |
| 149 | 149 | #ssh.close() |
| 150 | 150 | |
| 151 | class Prinboo: | |
| 151 | class PrinbooClass: | |
| 152 | 152 | def __init__(self, address): |
| 153 | 153 | self.limbs = LimbServos(address) |
| 154 | 154 | self.motors = Motors(address) |
| … | … | @@ -164,6 +164,8 @@ class Prinboo: |
| 164 | 164 | self.thread.exit() |
| 165 | 165 | if self.limbsThread: self.limbsThread.exit() |
| 166 | 166 | |
| 167 | Prinboo = PrinbooClass('10.0.0.23') | |
| 168 | ||
| 167 | 169 | if __name__ == '__main__': |
| 168 | 170 | addr = 'localhost' |
| 169 | 171 | #p = Prinboo(addr, '') |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [0,0,0,0,0,0,0,0,0,0,0,0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [0,0,0,0,0,0,0,0,0,0,0,0], 'servos': [512, 512]}, '10.0.0.63': {'channels': [62038,0,20000,65534,34289,0,65534,54315,0,36009,0,20000], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [0,0,0,0,0,0,0,0,0,0,0,0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [0,0,0,0,0,0,0,0,0,0,0,0], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0,18051,20000,18051,0,20000,65534,0,11974,62591,0,20000], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'Limbs': {1: 102, 2: 176, 3: 0, 4: 80, 5: 0, 6: 0, 7: 89, 8: 116, 9: 137, 10: 180, 11: 124} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [999, 0, 0, 999, 0, 0, 999, 0, 0, 999, 0, 0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [999, 0, 0, 999, 0, 0, 999, 0, 0, 999, 0, 0], 'servos': [512, 512]}, '10.0.0.63': {'channels': [999, 0, 0, 999, 0, 0, 999, 0, 0, 999, 0, 0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [657,111,0,203,69,0,55281,10674,0,25086,0,8219], 'servos': [512, 512]}, '10.0.0.31': {'channels': [278,0,54,278,0,38,14988,0,6528,55281,0,36], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0,0,0,0,0,0,0,0,0,0,0,0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [0,0,0,65534,6242,0,65534,8686,0,65534,3334,0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [56942,0,6891,0,0,0,1518,8581,20000,65534,2,7696], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0,0,0,0,0,0,0,0,0,0,0,0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'Limbs': {1: 102, 2: 176, 3: 0, 4: 3, 5: 0, 6: 0, 7: 89, 8: 180, 9: 135, 10: 35, 11: 124} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [0,0,0,65534,6242,0,65534,8686,0,65534,3334,0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [56942,0,6891,0,0,0,1518,8581,20000,65534,2,7696], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0,0,0,0,0,0,0,0,0,0,0,0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0, 18051, 20000, 18051, 0, 20000, 65534, 0, 11974, 62591, 0, 20000], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [56942,2314,0,65534,6242,0,65534,8686,0,65534,3334,0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [3916, 0, 77, 212, 0, 29, 0, 16656, 20000, 0, 15960, 19997], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0, 0, 0, 0, 0, 0, 0, 0, 0, 01, 0, 0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [0, 999, 0, 0, 999, 0, 0, 999, 0, 0, 999, 0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [0, 999, 0, 0, 999, 0, 0, 999, 0, 0, 999, 0], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0, 999, 0, 0, 999, 0, 0, 999, 0, 0, 999, 0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [0, 0, 0, 0, 0, 0, 0, 879, 999, 0, 0, 0], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'Limbs': {1: 26, 2: 176, 3: 0, 4: 3, 5: 0, 6: 0, 7: 89, 8: 180, 9: 135, 10: 174, 11: 124}, | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [999, 979, 620, 999, 999, 0, 999, 999, 0, 699, 0, 0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [999, 979, 620, 999, 999, 0, 999, 999, 0, 699, 0, 0], 'servos': [512, 512]}, '10.0.0.63': {'channels': [999, 979, 620, 999, 999, 0, 999, 999, 0, 699, 0, 0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'Limbs': {1: 102, 2: 176, 3: 0, 4: 3, 5: 0, 6: 0, 7: 89, 8: 180, 9: 135, 10: 174, 11: 124} | |
| 4 | } |
| … | … | @@ -1,5 +1,4 @@ |
| 1 | 1 | { |
| 2 | 2 | 'version': 0, |
| 3 | 'DMX': None, | |
| 4 | 'LightArm': {'10.0.2.2': {'servos': [512, 512], 'intensity': 0}, '10.0.2.6': {'servos': [512, 512], 'intensity': 0}, '10.0.2.3': {'servos': [512, 512], 'intensity': 0}, '10.0.2.4': {'servos': [512, 512], 'intensity': 0}, '10.0.2.5': {'servos': [512, 512], 'intensity': 0}} | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'servos': [512, 512]}} | |
| 5 | 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [0, 0, 999, 0, 0, 999, 0, 0, 999, 0, 0, 0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [0, 0, 999, 0, 0, 999, 0, 0, 999, 0, 0, 0], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0, 0, 999, 0, 0, 999, 0, 0, 999, 0, 0, 0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'Limbs': {1: 166, 2: 176, 3: 0, 4: 3, 5: 0, 6: 0, 7: 89, 8: 180, 9: 135, 10: 174, 11: 124}, | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [27526, 0, 788, 28093, 0, 1134, 0, 0, 0, 0, 0, 0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [27526, 0, 788, 28093, 0, 1134, 0, 0, 0, 0, 0, 0,], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [657,111,0,203,69,0,4064,0,20000,471,101,0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [278,0,54,278,0,38,0,850,20000,2674,0,20000], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0,0,0,0,0,0,0,0,0,0,0,0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'Limbs': {1: 141, 2: 73, 3: 76, 4: 106, 5: 6, 6: 26, 7: 89, 8: 111, 9: 135, 10: 176, 11: 124} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [657,111,0,203,69,0,65534,4779,0,65534,1423,0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [278,0,54,278,0,38,65534,0,123,65534,11770,0], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0,0,0,0,0,0,0,0,0,0,0,0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [657,111,0,203,69,0,0,28958,651,29118,16058,0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [278,0,54,21912,65534,0,0,9771,8750,239,0,47], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0,0,0,0,0,0,0,0,0,0,0,0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [657,111,0,203,69,0,0,26164,20000,0,16140,20000], 'servos': [512, 512]}, '10.0.0.31': {'channels': [278,0,54,278,0,38,0,16656,20000,0,15962,20000], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0,0,0,0,0,0,0,0,0,0,0,0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -0,0 +1,4 @@ |
| 1 | { | |
| 2 | 'version': 0, | |
| 3 | 'LightArms': {'10.0.0.30': {'channels': [0,0,0,0,0,0,0,0,0,0,0,0], 'servos': [512, 512]}, '10.0.0.31': {'channels': [278,0,54,0,0,0,0,12121,20000,239,0,47], 'servos': [512, 512]}, '10.0.0.63': {'channels': [0,0,0,0,0,0,0,0,0,0,0,0], 'servos': [512, 512]}} | |
| 4 | } |
| … | … | @@ -4,8 +4,10 @@ |
| 4 | 4 | #include <WiFi.h> |
| 5 | 5 | #include <ESPmDNS.h> |
| 6 | 6 | #include <WiFiClient.h> |
| 7 | #include "/Users/jmzorko/work/circusautomatic/hardware/espressif/esp32/tools/sdk/include/soc/soc/rtc.h" | |
| 7 | //#include "/Users/jmzorko/work/circusautomatic/hardware/espressif/esp32/tools/sdk/include/soc/soc/rtc.h" | |
| 8 | 8 | //#include "/home/fleeky/Arduino/hardware/espressif/esp32/tools/sdk/include/freertos/freertos/task.h" |
| 9 | //#include "/home/cayuga/.arduino15/packages/esp32/hardware/esp32/1.0.1/tools/sdk/include/soc/soc/rtc.h" | |
| 10 | #include "/home/fleeky/Arduino/hardware/espressif/esp32/tools/sdk/include/soc/soc/rtc.h" | |
| 9 | 11 | |
| 10 | 12 | const char* ssid = "ubitron"; |
| 11 | 13 | const char* password = "superduper"; |
| … | … | @@ -26,8 +28,8 @@ const int timeout = 30; |
| 26 | 28 | #define RED_MAX_PWM 65534 |
| 27 | 29 | #define MAX_PWM 65534 |
| 28 | 30 | |
| 29 | constexpr int NumPeriods = 3; // number of steps in fade | |
| 30 | constexpr int PeriodLength = 1; // sleep for this many ms | |
| 31 | constexpr int NumPeriods = 1; // number of steps in fade | |
| 32 | constexpr int PeriodLength = 10; // sleep for this many ms | |
| 31 | 33 | |
| 32 | 34 | ////////////////////////////////////////////////////////////////////////////////////// |
| 33 | 35 | int freq = 20000; |