import random import time import pygame import sys import pyaudio import wave import glob import os from itertools import cycle from datetime import datetime from datetime import date import ast import random from pathlib import Path #import socket import FSM import utils as u import menus as m #states from sMain import Main from sSelectSound import SelectSound from sSelectPattern import SelectPattern from sEditSong import EditSong from sEditSoundSequence import EditSoundSequence from sFile import File from sUtil import Util from sBall import Ball from sExit import Exit from sReboot import Reboot from sClock import Clock from sShutdown import Shutdown from sSelTheme import SelTheme from sOpenSong import OpenSong from sEnterText import EnterText from sLoadSound import LoadSound from sPing import Ping from sWifi import Wifi from sDefender import Defender from sCalculator import Calculator from sAbout import About from sUpdate import Update from sSelectFolder import SelectFolder from sNewDir import NewDir #==================================== State = type("State", (object,), {}) #==================================== class State(object): def __init__(self, FSM): self.FSM = FSM self.timer = 0 self.startTime = 0 def Enter(self): self.timer = 0 self.startTime = 0 def Execute(self): print('Executing') def Exit(self): print('Exiting') #==================================== class Example(State): def __init__(self,FSM): super(Example, self).__init__(FSM) def Enter(self): self.FSM.stateLife = 1 super(Example, self).Enter() def Execute(self): self.FSM.stateLife += 1 def Exit(self): pass #==================================== class Startup(State): def __init__(self,FSM): super(Startup, self).__init__(FSM) def Enter(self): self.FSM.stateLife = 1 self.birth = time.perf_counter() super(Startup, self).Enter() def Execute(self): self.FSM.stateLife += 1 print('startup state') if hasattr(self, 'birth'): pass else: self.birth = time.perf_counter() self.FSM.ToTransition('toIntro') def Exit(self): pass #==================================== class Intro(State): def __init__(self,FSM): super(Intro, self).__init__(FSM) def Enter(self): self.FSM.stateLife = 1 o = self.FSM.owner o.header_text = "Starting up..." o.draw.rectangle((0, 0, self.FSM.owner.width, self.FSM.owner.height), outline=0, fill=o.blue) #u.draw_header(o) #o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue) o.center_block("zpc_ct", o.h4, [0, 0, o.width, o.height-40], o.light_grey) o.center_block("Starting up...", o.h2, [0, 0, o.width, o.height+60], o.light_grey) #o.display_thread.start() o.update_display(0) #o.update_display(0) super(Intro, self).Enter() def Execute(self): self.FSM.stateLife += 1 o = self.FSM.owner self.FSM.ToTransition('toLoadDefault') def Exit(self): pass #==================================== class LoadDefault(State): def __init__(self,FSM): super(LoadDefault, self).__init__(FSM) def Enter(self): self.FSM.stateLife = 1 o = self.FSM.owner o.init_slots() o.load_song() self.bank = 0 self.sounds = [] self.globbed = glob.glob('/home/pi/skull/*.wav') + glob.glob('/home/pi/skull/*.mp3') self.globbed.sort() obj_id = 0 # for s in o.sconf['sounds']: # p1 = self.FSM.owner.SoundSlot(s, obj_id, o) # self.FSM.owner.soundSlots.append(p1) # obj_id += 1 # _iter = 0 # lst = ast.literal_eval(o.sconf['notes'][0]) # print('length ', len(lst)) # for n in o.soundSlots: # m = [] # if _iter < (len(o.sconf.as_list('notes')) - 1): # lst = ast.literal_eval(o.sconf.as_list('notes')[_iter]) # n.notes = lst # _iter += 1 super(LoadDefault, self).Enter() def Execute(self): self.FSM.stateLife += 1 self.FSM.ToTransition('toMain') def Exit(self): pass #==================================== #==================================== class PadPlayer(State): def __init__(self,FSM): super(PadPlayer, self).__init__(FSM) def Enter(self): self.FSM.stateLife = 1 print('entering pad player') super(PadPlayer, self).Enter() def Execute(self): self.FSM.stateLife += 1 _id = 0 for k in self.FSM.owner.keyState: if _id < 16 and k == 1: self.FSM.owner.soundSlots[_id].play() _id += 1 if self.FSM.owner.keys: print("Pressed: ", self.FSM.owner.keys) #self.FSM.ToTransition('toLand') def Exit(self): pass #==================================== class SeqPlayer(State): def __init__(self,FSM): super(SeqPlayer, self).__init__(FSM) def Enter(self): self.FSM.stateLife = 1 self.beat = 0 self.FSM.owner.pub.register("beat", self) print('entering seq player') o = self.FSM.owner o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue) o.draw.text((20, 0), 'SeqPlayer', font=o.h1, fill="#FFFFFF") o.update_display(0) super(SeqPlayer, self).Enter() def Execute(self): self.FSM.stateLife += 1 o = self.FSM.owner if o.keyState[12] == 1: o.start_playback() u.play_seq(o, [o.curPattern, 0]) if o.keyState[13] == 1: o.stop_playback() #self.beat = o.playhead #print('key0 ', o.keyState[16]) if o.keyState[16] == 2: #print('key0 ', o.keyState[16]) if o.keyState[0] == 1: print('to main') self.FSM.ToTransition('toMain') def ReceiveMessage(self, message): #print(self.name, 'got message', message) o = self.FSM.owner o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue) o.draw.text((20, 0), str(message[0]) + ' - ' + str(message[1]), font=o.h1, fill="#FFFFFF") o.update_display(0) u.play_seq(o, message) def Exit(self): self.FSM.owner.pub.unregister("beat", self) #====================================