raspberry pi zero based drum machine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

StatesProg.py 85KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185
  1. import random
  2. import time
  3. import pygame
  4. import sys
  5. import pyaudio
  6. import wave
  7. import glob
  8. import os
  9. from itertools import cycle
  10. from datetime import datetime
  11. from datetime import date
  12. import ast
  13. import random
  14. from pathlib import Path
  15. import socket
  16. import git
  17. import FSM
  18. #====================================
  19. State = type("State", (object,), {})
  20. #====================================
  21. class State(object):
  22. def __init__(self, FSM):
  23. self.FSM = FSM
  24. self.timer = 0
  25. self.startTime = 0
  26. def Enter(self):
  27. self.timer = 0
  28. self.startTime = 0
  29. def Execute(self):
  30. print('Executing')
  31. def Exit(self):
  32. print('Exiting')
  33. #====================================
  34. def play_seq(o, message):
  35. _id = 0
  36. o.clear_notes_on()
  37. for s in o.soundSlots:
  38. if s.notes[message[0]][message[1]][0] == 1:
  39. o.notes_on[_id] = 1
  40. o.soundSlots[_id].play(s.notes[message[0]][message[1]][1])
  41. _id += 1
  42. #print(o.notes_on)
  43. def draw_header(o):
  44. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  45. o.center_text(o.header_text, o.h1, o.width, 25, o.light_grey)
  46. o.center_text("----------------------", o.h2, o.width, 55, o.light_grey)
  47. def text_box1(o, a, b):
  48. w1 = 0
  49. w2 = (o.width / 2) - 50
  50. h1 = 45
  51. h2 = h1 + 10
  52. o.center_block(a, o.h2, [w1,h1,w2,h2], o.light_grey)
  53. o.center_block(b, o.h2, [w1,h1+10,w2,h2+25], o.light_grey)
  54. def text_box2(o, a, b):
  55. w1 = 0
  56. w2 = (o.width / 2) - 50
  57. h1 = 90
  58. h2 = h1 + 10
  59. o.center_block(a, o.h2, [w1,h1,w2,h2], o.light_grey)
  60. o.center_block(b, o.h2, [w1,h1+10,w2,h2+25], o.light_grey)
  61. def text_box3(o, a, b):
  62. w1 = (o.width / 2) + 40
  63. w2 = o.width
  64. h1 = 45
  65. h2 = h1 + 10
  66. o.center_block(a, o.h2, [w1,h1,w2,h2], o.light_grey)
  67. o.center_block(b, o.h2, [w1,h1+10,w2,h2+25], o.light_grey)
  68. def text_box4(o, a, b):
  69. w1 = (o.width / 2) + 40
  70. w2 = o.width
  71. h1 = 90
  72. h2 = h1 + 10
  73. o.center_block(a, o.h2, [w1,h1,w2,h2], o.light_grey)
  74. o.center_block(b, o.h2, [w1,h1+10,w2,h2+25], o.light_grey)
  75. def text_center(o, a, b):
  76. w1 = 0
  77. w2 = o.width
  78. h1 = 45
  79. h2 = h1 + 10
  80. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  81. o.center_block(a, o.h1, [w1,h1,w2,h2], o.light_grey)
  82. o.center_block(b, o.h1, [w1,h1+20,w2,h2+45], o.light_grey)
  83. #====================================
  84. def breakup_song_text(song):
  85. line1 = ""
  86. line2 = ""
  87. line3 = ""
  88. line4 = ""
  89. if len(song) < 9:
  90. for x in song:
  91. line1 += str(x) + '.'
  92. elif len(song) < 17:
  93. _iter = 0
  94. for x in song:
  95. if _iter < 8:
  96. line1 += str(x) + '.'
  97. else:
  98. line2 += str(x) + '.'
  99. _iter += 1
  100. elif len(song) < 25:
  101. _iter = 0
  102. for x in song:
  103. if _iter < 8:
  104. line1 += str(x) + '.'
  105. elif _iter < 16:
  106. line2 += str(x) + '.'
  107. else:
  108. line3 += str(x) + '.'
  109. _iter += 1
  110. elif len(song) < 33:
  111. _iter = 0
  112. for x in song:
  113. if _iter < 8:
  114. line1 += str(x) + '.'
  115. elif _iter < 16:
  116. line2 += str(x) + '.'
  117. elif _iter < 24:
  118. line3 += str(x) + '.'
  119. else:
  120. line4 += str(x) + '.'
  121. _iter += 1
  122. else:
  123. _iter = 0
  124. cur_id = len(song) - 1
  125. _iter = 0
  126. ns = song.copy()
  127. while len(ns) > 31:
  128. del ns[0]
  129. for x in ns:
  130. if _iter < 7:
  131. line1 += str(x) + '.'
  132. elif _iter < 15:
  133. line2 += str(x) + '.'
  134. elif _iter < 23:
  135. line3 += str(x) + '.'
  136. else:
  137. line4 += str(x) + '.'
  138. _iter += 1
  139. line1 = ".." + line1
  140. return [line1, line2, line3, line4]
  141. def draw_menu1(o):
  142. bpm_inc = 4
  143. x_size = o.width / 4
  144. y_size = o.height / 4
  145. og_x = 0
  146. o_x = og_x
  147. o_y = o.height
  148. text_padding = 6
  149. _id = 0
  150. while _id < 16:
  151. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.blue)
  152. if _id == 0:
  153. o.center_block("Main", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  154. if _id == 1:
  155. o.center_block("Note", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  156. if _id == 2:
  157. o.center_block("Patt", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  158. if _id == 3:
  159. o.center_block("Song", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  160. if _id == 4:
  161. o.center_block("File", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  162. if _id == 5:
  163. o.center_block("Util", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  164. # if _id == 6:
  165. # o.center_block("Bank-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  166. # if _id == 7:
  167. # o.center_block("Bank+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  168. if _id == 8:
  169. o.center_block("Vol-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  170. if _id == 9:
  171. o.center_block("Vol+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  172. #if _id == 11:
  173. #o.center_block("", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  174. if _id == 12:
  175. o.center_block("Play", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  176. if _id == 13:
  177. o.center_block("Stop", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  178. if _id == 10:
  179. o.center_block("BPM-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  180. if _id == 11:
  181. o.center_block("BPM+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  182. o_x = o_x + x_size
  183. _id += 1
  184. if _id % 4 == 0:
  185. o_y -= y_size
  186. o_x = og_x
  187. def draw_menu2_sample(o):
  188. bpm_inc = 4
  189. x_size = o.width / 4
  190. y_size = o.height / 4
  191. og_x = 0
  192. o_x = og_x
  193. o_y = o.height
  194. text_padding = 6
  195. _id = 0
  196. while _id < 16:
  197. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.dark_grey)
  198. if _id == 0:
  199. o.center_block("Copy", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  200. if _id == 1:
  201. o.center_block("Paste", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  202. if _id == 2:
  203. o.center_block("Del", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  204. if _id == 3:
  205. o.center_block("Load", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  206. if _id == 8:
  207. o.center_block("Vol-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  208. if _id == 9:
  209. o.center_block("Vol+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  210. if _id == 6:
  211. o.center_block("Bank-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  212. if _id == 7:
  213. o.center_block("Bank+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  214. if _id == 10:
  215. o.center_block("Pitch-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  216. if _id == 11:
  217. o.center_block("Pitch+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  218. if _id == 12:
  219. if o.odub == True:
  220. o.center_block("Odub", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.pink)
  221. else:
  222. o.center_block("Odub", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  223. if _id == 13:
  224. o.center_block("Undo", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  225. o_x = o_x + x_size
  226. _id += 1
  227. if _id % 4 == 0:
  228. o_y -= y_size
  229. o_x = og_x
  230. def draw_menu2_pattern(o):
  231. bpm_inc = 4
  232. x_size = o.width / 4
  233. y_size = o.height / 4
  234. og_x = 0
  235. o_x = og_x
  236. o_y = o.height
  237. text_padding = 6
  238. _id = 0
  239. while _id < 16:
  240. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.dark_grey)
  241. if _id == 0:
  242. o.center_block("Copy", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  243. if _id == 1:
  244. o.center_block("Paste", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  245. if _id == 2:
  246. o.center_block("Clear", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  247. if _id == 6:
  248. o.center_block("Bank -", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  249. if _id == 7:
  250. o.center_block("Bank +", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  251. o_x = o_x + x_size
  252. _id += 1
  253. if _id % 4 == 0:
  254. o_y -= y_size
  255. o_x = og_x
  256. def draw_menu2_note(o):
  257. bpm_inc = 4
  258. x_size = o.width / 4
  259. y_size = o.height / 4
  260. og_x = 0
  261. o_x = og_x
  262. o_y = o.height
  263. text_padding = 6
  264. _id = 0
  265. while _id < 16:
  266. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.dark_grey)
  267. if _id == 8:
  268. o.center_block("Vol -", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  269. elif _id == 9:
  270. o.center_block("Vol +", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  271. elif _id == 12:
  272. if o.patternFollow:
  273. o.center_block("Follow", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.pink)
  274. else:
  275. o.center_block("Follow", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  276. o_x = o_x + x_size
  277. _id += 1
  278. if _id % 4 == 0:
  279. o_y -= y_size
  280. o_x = og_x
  281. def draw_menu2_song(o):
  282. bpm_inc = 4
  283. x_size = o.width / 4
  284. y_size = o.height / 4
  285. og_x = 0
  286. o_x = og_x
  287. o_y = o.height
  288. text_padding = 6
  289. _id = 0
  290. while _id < 16:
  291. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.dark_grey)
  292. if _id == 6:
  293. o.center_block("Bank -", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  294. if _id == 7:
  295. o.center_block("Bank +", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  296. o_x = o_x + x_size
  297. _id += 1
  298. if _id % 4 == 0:
  299. o_y -= y_size
  300. o_x = og_x
  301. def menu1_actions(self, o):
  302. if o.keyState[8] == 4 or o.keyState[8] == 3:
  303. print('reset repeat from menu')
  304. o.button_repeater(1,[])
  305. if o.keyState[9] == 4 or o.keyState[9] == 3:
  306. print('reset repeat from menu')
  307. o.button_repeater(1,[])
  308. if o.keyState[16] == 2:
  309. #print('key 8 ', o.keyState[8])
  310. #o.button_repeater(0, [8,9,14,15])
  311. if o.keyState[0] == 1:
  312. self.FSM.ToTransition('toMain')
  313. elif o.keyState[1] == 1:
  314. self.FSM.ToTransition('toEditSoundSequence')
  315. elif o.keyState[2] == 1:
  316. self.FSM.ToTransition('toSelectPattern')
  317. elif o.keyState[3] == 1:
  318. self.FSM.ToTransition('toEditSong')
  319. elif o.keyState[4] == 1:
  320. self.FSM.ToTransition('toFile')
  321. elif o.keyState[5] == 1:
  322. self.FSM.ToTransition('toUtil')
  323. if o.keyState[12] == 1:
  324. o.start_playback()
  325. play_seq(o, [o.curPattern, 0])
  326. if o.keyState[13] == 1:
  327. o.stop_playback()
  328. if o.keyState[8] == 2:
  329. if (o.repeater_states[8] != None and ((pygame.time.get_ticks() - o.repeater_states[8]) > 500)):
  330. if o.volume > 0:
  331. o.volume -= 1
  332. text_center(o, "Master Volume", str(o.volume))
  333. o.update_display(0)
  334. o.repeater_states[8] = pygame.time.get_ticks()
  335. if o.keyState[8] == 1:
  336. o.repeater_states[8] = pygame.time.get_ticks()
  337. if o.volume > 0:
  338. o.volume -= 1
  339. text_center(o, "Master Volume", str(o.volume))
  340. o.update_display(0)
  341. if o.keyState[9] == 2:
  342. if (o.repeater_states[9] != None and ((pygame.time.get_ticks() - o.repeater_states[9]) > 500)):
  343. if o.volume < 16:
  344. o.volume += 1
  345. text_center(o, "Master Volume", str(o.volume))
  346. o.update_display(0)
  347. o.repeater_states[9] = pygame.time.get_ticks()
  348. if o.keyState[9] == 1:
  349. o.repeater_states[9] = pygame.time.get_ticks()
  350. if o.volume < 16:
  351. o.volume += 1
  352. text_center(o, "Master Volume", str(o.volume))
  353. o.update_display(0)
  354. if o.keyState[11] == 1:
  355. #o.save_song()
  356. pass
  357. if o.keyState[10] == 2:
  358. if (o.repeater_states[10] != None and ((pygame.time.get_ticks() - o.repeater_states[10]) > 500)):
  359. if o.bpm > 60:
  360. o.bpm = o.bpm - o.bpm_inc
  361. o.update_bpm()
  362. text_center(o, "Master BPM", str(o.bpm))
  363. o.update_display(0)
  364. o.repeater_states[10] = pygame.time.get_ticks()
  365. if o.keyState[10] == 1:
  366. o.repeater_states[10] = pygame.time.get_ticks()
  367. if o.bpm > 60:
  368. o.bpm = o.bpm - o.bpm_inc
  369. o.update_bpm()
  370. text_center(o, "Master BPM", str(o.bpm))
  371. o.update_display(0)
  372. if o.keyState[11] == 2:
  373. if (o.repeater_states[11] != None and ((pygame.time.get_ticks() - o.repeater_states[11]) > 500)):
  374. if o.bpm < 240:
  375. o.bpm = o.bpm + o.bpm_inc
  376. o.update_bpm()
  377. text_center(o, "Master BPM", str(o.bpm))
  378. o.update_display(0)
  379. o.repeater_states[11] = pygame.time.get_ticks()
  380. if o.keyState[11] == 1:
  381. o.repeater_states[11] = pygame.time.get_ticks()
  382. if o.bpm < 240:
  383. o.bpm = o.bpm + o.bpm_inc
  384. o.update_bpm()
  385. text_center(o, "Master BPM", str(o.bpm))
  386. o.update_display(0)
  387. def menu2_actions_sample(self, o):
  388. if o.keyState[6] == 4 or o.keyState[6] == 3:
  389. print('reset repeat from menu')
  390. o.button_repeater(1,[])
  391. if o.keyState[7] == 4 or o.keyState[7] == 3:
  392. print('reset repeat from menu')
  393. o.button_repeater(1,[])
  394. if o.keyState[8] == 4 or o.keyState[8] == 3:
  395. print('reset repeat from menu')
  396. o.button_repeater(1,[])
  397. if o.keyState[9] == 4 or o.keyState[9] == 3:
  398. print('reset repeat from menu')
  399. o.button_repeater(1,[])
  400. if o.keyState[10] == 4 or o.keyState[10] == 3:
  401. print('reset repeat from menu')
  402. o.button_repeater(1,[])
  403. if o.keyState[11] == 4 or o.keyState[11] == 3:
  404. print('reset repeat from menu')
  405. o.button_repeater(1,[])
  406. if o.keyState[17] == 2:
  407. if o.keyState[0] == 1:
  408. if o.soundSlots[o.eSound].volume > 0:
  409. print('copy')
  410. o.soundClipboard = [o.soundSlots[o.eSound].file, o.soundSlots[o.eSound].volume, o.soundSlots[o.eSound].pitch]
  411. print(o.soundClipboard)
  412. if o.keyState[1] == 1:
  413. if o.soundClipboard != []:
  414. print('pasting ', o.soundClipboard)
  415. o.soundSlots[o.eSound].file = o.soundClipboard[0]
  416. o.soundSlots[o.eSound].volume = o.soundClipboard[1]
  417. o.soundSlots[o.eSound].pitch = o.soundClipboard[2]
  418. o.soundSlots[o.eSound].create_sound()
  419. o.soundSlots[o.eSound].set_pitch()
  420. if o.keyState[2] == 1:
  421. print('delete sound ', o.eSound)
  422. o.soundSlots[o.eSound].file = None
  423. o.soundSlots[o.eSound].volume = 16
  424. o.soundSlots[o.eSound].pitch = 0
  425. if o.keyState[3] == 1:
  426. print('load')
  427. o.FSM.FSM.ToTransition("toLoadSound")
  428. if o.keyState[8] == 2:
  429. if (o.repeater_states[8] != None and ((pygame.time.get_ticks() - o.repeater_states[8]) > 500)):
  430. if o.soundSlots[o.eSound].volume > 0:
  431. o.soundSlots[o.eSound].volume -= 1
  432. text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
  433. o.update_display(0)
  434. o.repeater_states[8] = pygame.time.get_ticks()
  435. if o.keyState[8] == 1:
  436. if o.soundSlots[o.eSound].volume > 0:
  437. o.soundSlots[o.eSound].volume -= 1
  438. text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
  439. o.update_display(0)
  440. o.repeater_states[8] = pygame.time.get_ticks()
  441. if o.keyState[9] == 2:
  442. if (o.repeater_states[9] != None and ((pygame.time.get_ticks() - o.repeater_states[9]) > 500)):
  443. if o.soundSlots[o.eSound].volume < 16:
  444. o.soundSlots[o.eSound].volume += 1
  445. text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
  446. o.update_display(0)
  447. o.repeater_states[9] = pygame.time.get_ticks()
  448. if o.keyState[9] == 1:
  449. if o.soundSlots[o.eSound].volume < 16:
  450. o.soundSlots[o.eSound].volume += 1
  451. text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
  452. o.update_display(0)
  453. o.repeater_states[9] = pygame.time.get_ticks()
  454. if o.keyState[6] == 2:
  455. if (o.repeater_states[6] != None and ((pygame.time.get_ticks() - o.repeater_states[6]) > 500)):
  456. if o.note_bank > 0:
  457. o.note_bank -= 1
  458. text_center(o, "Sound Bank", str(o.note_bank))
  459. o.update_display(0)
  460. o.repeater_states[6] = pygame.time.get_ticks()
  461. if o.keyState[6] == 1:
  462. if o.note_bank > 0:
  463. o.note_bank -= 1
  464. text_center(o, "Sound Bank", str(o.note_bank))
  465. o.repeater_states[6] = pygame.time.get_ticks()
  466. o.update_display(0)
  467. if o.keyState[7] == 2:
  468. if (o.repeater_states[7] != None and ((pygame.time.get_ticks() - o.repeater_states[7]) > 500)):
  469. if o.note_bank < 3:
  470. o.note_bank += 1
  471. text_center(o, "Sound Bank", str(o.note_bank))
  472. o.update_display(0)
  473. o.repeater_states[7] = pygame.time.get_ticks()
  474. if o.keyState[7] == 1:
  475. if o.note_bank < 3:
  476. o.note_bank += 1
  477. text_center(o, "Sound Bank", str(o.note_bank))
  478. o.repeater_states[7] = pygame.time.get_ticks()
  479. o.update_display(0)
  480. if o.keyState[10] == 2:
  481. if (o.repeater_states[10] != None and ((pygame.time.get_ticks() - o.repeater_states[10]) > 500)):
  482. if o.soundSlots[o.eSound].pitch > -10:
  483. o.soundSlots[o.eSound].pitch -= 1
  484. text_center(o, "Sample Pitch", str(o.soundSlots[o.eSound].pitch))
  485. o.soundSlots[o.eSound].set_pitch()
  486. o.update_display(0)
  487. o.repeater_states[10] = pygame.time.get_ticks()
  488. if o.keyState[10] == 1:
  489. if o.soundSlots[o.eSound].pitch > -10:
  490. o.soundSlots[o.eSound].pitch -= 1
  491. text_center(o, "Sample Pitch", str(o.soundSlots[o.eSound].pitch))
  492. o.soundSlots[o.eSound].set_pitch()
  493. o.repeater_states[10] = pygame.time.get_ticks()
  494. o.update_display(0)
  495. if o.keyState[11] == 2:
  496. if (o.repeater_states[11] != None and ((pygame.time.get_ticks() - o.repeater_states[11]) > 500)):
  497. if o.soundSlots[o.eSound].pitch < 10:
  498. o.soundSlots[o.eSound].pitch += 1
  499. text_center(o, "Sample Pitch", str(o.soundSlots[o.eSound].pitch))
  500. o.soundSlots[o.eSound].set_pitch()
  501. o.update_display(0)
  502. o.repeater_states[11] = pygame.time.get_ticks()
  503. if o.keyState[11] == 1:
  504. if o.soundSlots[o.eSound].pitch < 10:
  505. o.soundSlots[o.eSound].pitch += 1
  506. text_center(o, "Sample Pitch", str(o.soundSlots[o.eSound].pitch))
  507. o.soundSlots[o.eSound].set_pitch()
  508. o.repeater_states[11] = pygame.time.get_ticks()
  509. o.update_display(0)
  510. if o.keyState[12] == 1:
  511. o.odub = not o.odub
  512. o.undo_buf = []
  513. print('odub now is ', o.odub)
  514. draw_menu2_sample(o)
  515. o.update_display(0)
  516. if o.keyState[13] == 1:
  517. print('undo something')
  518. for i in o.undo_buf:
  519. o.soundSlots[i[0]].notes[i[1]][i[2]][0] = 0
  520. o.soundSlots[i[0]].notes[i[1]][i[2]][1] = 0
  521. o.undo_buf = []
  522. def menu2_actions_pattern(self, o):
  523. if o.keyState[17] == 2:
  524. if o.keyState[0] == 1:
  525. print('copy')
  526. o.patternClipboard = []
  527. for s in o.soundSlots:
  528. notes = []
  529. for i in s.notes[o.ePattern]:
  530. notes.append([i[0], i[1]])
  531. o.patternClipboard.append(notes)
  532. print('adding to clip ', notes)
  533. elif o.keyState[1] == 1:
  534. print('paste')
  535. if o.patternClipboard != []:
  536. p = 0
  537. for s in o.soundSlots:
  538. n = 0
  539. for i in s.notes[o.ePattern]:
  540. i[0] = o.patternClipboard[p][n][0]
  541. i[1] = o.patternClipboard[p][n][1]
  542. n += 1
  543. print('added ', o.patternClipboard[p])
  544. p += 1
  545. else:
  546. print('nothing to paste')
  547. elif o.keyState[2] == 1:
  548. print('clear')
  549. print(o.soundSlots[o.eSound].notes[o.ePattern])
  550. for s in o.soundSlots:
  551. for i in s.notes[o.ePattern]:
  552. i[0] = 0
  553. i[1] = 0
  554. elif o.keyState[6] == 1:
  555. if o.pat_bank > 0:
  556. o.pat_bank -= 1
  557. text_center(o, "Pattern Bank", str(o.pat_bank))
  558. o.update_display(0)
  559. elif o.keyState[7] == 1:
  560. if o.pat_bank < 3:
  561. o.pat_bank += 1
  562. text_center(o, "Pattern Bank", str(o.pat_bank))
  563. o.update_display(0)
  564. def menu2_actions_song(self, o):
  565. if o.keyState[17] == 2:
  566. if o.keyState[6] == 1:
  567. if o.pat_bank > 0:
  568. o.pat_bank -= 1
  569. text_center(o, "Pattern Bank", str(o.pat_bank))
  570. o.update_display(0)
  571. elif o.keyState[7] == 1:
  572. if o.pat_bank < 3:
  573. o.pat_bank += 1
  574. text_center(o, "Pattern Bank", str(o.pat_bank))
  575. o.update_display(0)
  576. def menu2_actions_note(self, o):
  577. if o.keyState[8] == 4 or o.keyState[8] == 3:
  578. print('reset repeat from menu')
  579. o.button_repeater(1,[])
  580. if o.keyState[9] == 4 or o.keyState[9] == 3:
  581. print('reset repeat from menu')
  582. o.button_repeater(1,[])
  583. if o.keyState[17] == 2:
  584. if o.keyState[8] == 2:
  585. if (o.repeater_states[8] != None and ((pygame.time.get_ticks() - o.repeater_states[8]) > 500)):
  586. if o.note_vol > 0:
  587. o.note_vol -= 1
  588. text_center(o, "Note Volume", str(o.note_vol))
  589. o.update_display(0)
  590. o.repeater_states[8] = pygame.time.get_ticks()
  591. if o.keyState[8] == 1:
  592. if o.note_vol > 0:
  593. o.note_vol -= 1
  594. text_center(o, "Note Volume", str(o.note_vol))
  595. o.repeater_states[8] = pygame.time.get_ticks()
  596. o.update_display(0)
  597. if o.keyState[9] == 2:
  598. if (o.repeater_states[9] != None and ((pygame.time.get_ticks() - o.repeater_states[9]) > 500)):
  599. if o.note_vol < 16:
  600. o.note_vol += 1
  601. text_center(o, "Note Volume", str(o.note_vol))
  602. o.update_display(0)
  603. o.repeater_states[9] = pygame.time.get_ticks()
  604. if o.keyState[9] == 1:
  605. if o.note_vol < 16:
  606. o.note_vol += 1
  607. text_center(o, "Note Volume", str(o.note_vol))
  608. o.repeater_states[9] = pygame.time.get_ticks()
  609. o.update_display(0)
  610. if o.keyState[12] == 1:
  611. if o.patternFollow:
  612. o.patternFollow = False
  613. else:
  614. o.patternFollow = True
  615. print('pattern follow is ', o.patternFollow)
  616. draw_menu2_note(o)
  617. o.update_display(0)
  618. def util_command(self, o, command):
  619. if command == "Clock":
  620. self.FSM.ToTransition('toClock')
  621. elif command == "Balls":
  622. self.FSM.ToTransition('toBall')
  623. elif command == "Defender":
  624. self.FSM.ToTransition('toDefender')
  625. elif command == "Calculator":
  626. self.FSM.ToTransition('toCalculator')
  627. elif command == "Exit":
  628. self.FSM.ToTransition('toExit')
  629. elif command == "Theme":
  630. self.FSM.ToTransition('toSelTheme')
  631. elif command == "Reboot":
  632. self.FSM.ToTransition('toReboot')
  633. elif command == "Update":
  634. self.FSM.ToTransition('toUpdate')
  635. #os.system("sudo reboot")
  636. elif command == "Shutdown":
  637. self.FSM.ToTransition('toShutdown')
  638. elif command == "Ping":
  639. self.FSM.ToTransition('toPing')
  640. elif command == "Wifi":
  641. self.FSM.ToTransition('toWifi')
  642. def file_command(self, o, command):
  643. if command == "Save":
  644. if o.sconf['title'] != "blank":
  645. o.save_song()
  646. else:
  647. print('cant save over blank')
  648. elif command == "Open":
  649. self.FSM.ToTransition('toOpenSong')
  650. elif command == "Save As":
  651. self.FSM.ToTransition('toEnterText')
  652. elif command == "New":
  653. #self.FSM.ToTransition('toEnterText')
  654. #o.title = '_blank'
  655. o.mconf['default_song'] = '_blank'
  656. o.load_song()
  657. #====================================
  658. class Example(State):
  659. def __init__(self,FSM):
  660. super(Example, self).__init__(FSM)
  661. def Enter(self):
  662. self.FSM.stateLife = 1
  663. super(Example, self).Enter()
  664. def Execute(self):
  665. self.FSM.stateLife += 1
  666. def Exit(self):
  667. pass
  668. #====================================
  669. class Startup(State):
  670. def __init__(self,FSM):
  671. super(Startup, self).__init__(FSM)
  672. def Enter(self):
  673. self.FSM.stateLife = 1
  674. self.birth = time.perf_counter()
  675. super(Startup, self).Enter()
  676. def Execute(self):
  677. self.FSM.stateLife += 1
  678. print('startup state')
  679. if hasattr(self, 'birth'):
  680. pass
  681. else:
  682. self.birth = time.perf_counter()
  683. self.FSM.ToTransition('toIntro')
  684. def Exit(self):
  685. pass
  686. #====================================
  687. class Intro(State):
  688. def __init__(self,FSM):
  689. super(Intro, self).__init__(FSM)
  690. def Enter(self):
  691. self.FSM.stateLife = 1
  692. o = self.FSM.owner
  693. o.header_text = "Starting up..."
  694. o.draw.rectangle((0, 0, self.FSM.owner.width, self.FSM.owner.height), outline=0, fill=o.blue)
  695. #draw_header(o)
  696. #o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  697. o.center_block("Starting up...", o.h2, [0, 0, o.width, o.height], o.light_grey)
  698. #o.display_thread.start()
  699. o.update_display(0)
  700. #o.update_display(0)
  701. super(Intro, self).Enter()
  702. def Execute(self):
  703. self.FSM.stateLife += 1
  704. o = self.FSM.owner
  705. self.FSM.ToTransition('toLoadDefault')
  706. def Exit(self):
  707. pass
  708. #====================================
  709. class LoadDefault(State):
  710. def __init__(self,FSM):
  711. super(LoadDefault, self).__init__(FSM)
  712. def Enter(self):
  713. self.FSM.stateLife = 1
  714. o = self.FSM.owner
  715. o.init_slots()
  716. o.load_song()
  717. self.bank = 0
  718. self.sounds = []
  719. self.globbed = glob.glob('/home/pi/skull/*.wav') + glob.glob('/home/pi/skull/*.mp3')
  720. self.globbed.sort()
  721. obj_id = 0
  722. # for s in o.sconf['sounds']:
  723. # p1 = self.FSM.owner.SoundSlot(s, obj_id, o)
  724. # self.FSM.owner.soundSlots.append(p1)
  725. # obj_id += 1
  726. # _iter = 0
  727. # lst = ast.literal_eval(o.sconf['notes'][0])
  728. # print('length ', len(lst))
  729. # for n in o.soundSlots:
  730. # m = []
  731. # if _iter < (len(o.sconf.as_list('notes')) - 1):
  732. # lst = ast.literal_eval(o.sconf.as_list('notes')[_iter])
  733. # n.notes = lst
  734. # _iter += 1
  735. super(LoadDefault, self).Enter()
  736. def Execute(self):
  737. self.FSM.stateLife += 1
  738. self.FSM.ToTransition('toMain')
  739. def Exit(self):
  740. pass
  741. #====================================
  742. #====================================
  743. class Main(State):
  744. def __init__(self,FSM):
  745. super(Main, self).__init__(FSM)
  746. def Enter(self):
  747. print('hello main')
  748. self.FSM.owner.pub.register("beat", self)
  749. self.FSM.stateLife = 1
  750. o = self.FSM.owner
  751. o.header_text = "Sound Select"
  752. if o.keyState[16] > 0 or o.keyState[17] > 0:
  753. pass
  754. else:
  755. draw_header(o)
  756. self.draw_square()
  757. text_box1(o, "Vol", str(o.soundSlots[o.eSound].volume))
  758. text_box2(o, "BPM", str(o.bpm))
  759. text_box4(o, "Bank", str(o.note_bank))
  760. text_box3(o, "Pitch", str(o.soundSlots[o.eSound].pitch))
  761. o.update_display(0)
  762. #o.soundSlots[2].volume = 2
  763. self.recording = True
  764. self.record_queue = []
  765. self.undo_queue = []
  766. super(Main, self).Enter()
  767. def Execute(self):
  768. o = self.FSM.owner
  769. # if o.keyState[16] == 2:
  770. # o.button_repeater(0, [8,9,14,15])
  771. #if o.keyState[17] == 2:
  772. # o.button_repeater(0, [4,5,6,7,8,9])
  773. menu1_actions(self, o)
  774. menu2_actions_sample(self, o)
  775. #self.FSM.ToTransition('toClock')
  776. if o.keyState[16] == 1:
  777. draw_menu1(o)
  778. o.update_display(0)
  779. elif o.keyState[16] == 4:
  780. draw_header(o)
  781. self.draw_square()
  782. #print('esound ', o.eSound)
  783. #print('oss ', o.soundSlots[o.eSound].volume)
  784. text_box1(o, "Vol", str(o.soundSlots[o.eSound].volume))
  785. text_box2(o, "BPM", str(o.bpm))
  786. text_box4(o, "Bank", str(o.note_bank))
  787. text_box3(o, "Pitch", str(o.soundSlots[o.eSound].pitch))
  788. o.button_repeater(1, [])
  789. o.update_display(0)
  790. if o.keyState[17] == 1:
  791. draw_menu2_sample(o)
  792. o.update_display(0)
  793. elif o.keyState[17] == 4:
  794. draw_header(o)
  795. self.draw_square()
  796. text_box1(o, "Vol", str(o.soundSlots[o.eSound].volume))
  797. text_box2(o, "BPM", str(o.bpm))
  798. text_box4(o, "Bank", str(o.note_bank))
  799. text_box3(o, "Pitch", str(o.soundSlots[o.eSound].pitch))
  800. o.update_display(0)
  801. _id = 0
  802. for k in o.keyState:
  803. if _id > 15:
  804. pass
  805. else:
  806. if o.keyState[16] > 0 or o.keyState[17] > 0:
  807. pass
  808. else:
  809. if k == 1:
  810. note = _id + o.note_bank * 16
  811. self.record_queue = pygame.time.get_ticks()
  812. print('bpm is ', o.half_bpm, ' ', self.record_queue)
  813. o.soundSlots[note].play(o.note_vol)
  814. o.eSound = note
  815. print('now editing sound ', o.eSound)
  816. draw_header(o)
  817. #text_box1(o, "SVol", str(o.soundSlots[o.eSound].volume))
  818. text_box1(o, "SVol", str(o.slots[o.eSound].volume))
  819. text_box2(o, "BPM", str(o.bpm))
  820. text_box4(o, "Bank", str(o.note_bank))
  821. #text_box3(o, "Pitch", str(o.soundSlots[o.eSound].pitch))
  822. text_box3(o, "Pitch", str(o.soundSlots[o.eSound].pitch))
  823. self.draw_square()
  824. o.update_display(0)
  825. _id += 1
  826. def ReceiveMessage(self, message):
  827. o = self.FSM.owner
  828. play_seq(o, message)
  829. if o.keyState[16] > 0 or o.keyState[17] > 0:
  830. pass
  831. else:
  832. draw_header(o)
  833. self.draw_square()
  834. text_box1(o, "SVol", str(o.soundSlots[o.eSound].volume))
  835. text_box2(o, "BPM", str(o.bpm))
  836. text_box4(o, "Bank", str(o.note_bank))
  837. text_box3(o, "Pitch", str(o.soundSlots[o.eSound].pitch))
  838. o.update_display(0)
  839. if self.record_queue != []:
  840. cur_time = pygame.time.get_ticks()
  841. note_pos = (cur_time - self.record_queue) - (o.half_bpm / 2)
  842. print(note_pos)
  843. if o.odub == True:
  844. if note_pos > (o.half_bpm):
  845. _note = 0
  846. if message[1] == 0:
  847. _note = 15
  848. else:
  849. _note = message[1] - 1
  850. if o.soundSlots[o.eSound].notes[message[0]][_note][0] != 1:
  851. o.soundSlots[o.eSound].notes[message[0]][_note][0] = 1
  852. o.soundSlots[o.eSound].notes[message[0]][_note][1] = o.note_vol
  853. o.undo_buf.append([o.eSound, message[0], _note])
  854. print(o.undo_buf)
  855. else:
  856. if o.soundSlots[o.eSound].notes[message[0]][message[1]][0] != 1:
  857. o.soundSlots[o.eSound].notes[message[0]][message[1]][0] = 1
  858. o.soundSlots[o.eSound].notes[message[0]][message[1]][1] = o.note_vol
  859. o.undo_buf.append([o.eSound, message[0], message[1]])
  860. print(o.undo_buf)
  861. self.record_queue = []
  862. def draw_square(self):
  863. o = self.FSM.owner
  864. size = 22
  865. og_x = (o.width / 2) - (size * 2)
  866. o_x = og_x
  867. o_y = 127
  868. _id = o.note_bank * 16
  869. while _id < ((o.note_bank * 16) + 16):
  870. if _id == o.eSound:
  871. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.light_grey, width=1)
  872. elif o.notes_on[_id] == 1:
  873. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.grey, width=1)
  874. #elif _id > (len(o.soundSlots) - 1):
  875. elif self.has_sample(o, _id) == False:
  876. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.dark_grey, width=1)
  877. else:
  878. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.blue, width=1)
  879. o_x = o_x + size
  880. _id += 1
  881. if _id % 4 == 0:
  882. o_y -= size
  883. o_x = og_x
  884. def has_sample(self, o, slot):
  885. if o.soundSlots[slot].file != None:
  886. return True
  887. else:
  888. return False
  889. def Exit(self):
  890. self.FSM.owner.pub.unregister("beat", self)
  891. #====================================
  892. #====================================
  893. class PadPlayer(State):
  894. def __init__(self,FSM):
  895. super(PadPlayer, self).__init__(FSM)
  896. def Enter(self):
  897. self.FSM.stateLife = 1
  898. print('entering pad player')
  899. super(PadPlayer, self).Enter()
  900. def Execute(self):
  901. self.FSM.stateLife += 1
  902. _id = 0
  903. for k in self.FSM.owner.keyState:
  904. if _id < 16 and k == 1:
  905. self.FSM.owner.soundSlots[_id].play()
  906. _id += 1
  907. if self.FSM.owner.keys:
  908. print("Pressed: ", self.FSM.owner.keys)
  909. #self.FSM.ToTransition('toLand')
  910. def Exit(self):
  911. pass
  912. #====================================
  913. class SeqPlayer(State):
  914. def __init__(self,FSM):
  915. super(SeqPlayer, self).__init__(FSM)
  916. def Enter(self):
  917. self.FSM.stateLife = 1
  918. self.beat = 0
  919. self.FSM.owner.pub.register("beat", self)
  920. print('entering seq player')
  921. o = self.FSM.owner
  922. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  923. o.draw.text((20, 0), 'SeqPlayer', font=o.h1, fill="#FFFFFF")
  924. o.update_display(0)
  925. super(SeqPlayer, self).Enter()
  926. def Execute(self):
  927. self.FSM.stateLife += 1
  928. o = self.FSM.owner
  929. if o.keyState[12] == 1:
  930. o.start_playback()
  931. play_seq(o, [o.curPattern, 0])
  932. if o.keyState[13] == 1:
  933. o.stop_playback()
  934. #self.beat = o.playhead
  935. #print('key0 ', o.keyState[16])
  936. if o.keyState[16] == 2:
  937. #print('key0 ', o.keyState[16])
  938. if o.keyState[0] == 1:
  939. print('to main')
  940. self.FSM.ToTransition('toMain')
  941. def ReceiveMessage(self, message):
  942. #print(self.name, 'got message', message)
  943. o = self.FSM.owner
  944. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  945. o.draw.text((20, 0), str(message[0]) + ' - ' + str(message[1]), font=o.h1, fill="#FFFFFF")
  946. o.update_display(0)
  947. play_seq(o, message)
  948. def Exit(self):
  949. self.FSM.owner.pub.unregister("beat", self)
  950. #====================================
  951. #====================================
  952. class SelectSound(State):
  953. def __init__(self,FSM):
  954. super(SelectSound, self).__init__(FSM)
  955. def Enter(self):
  956. self.FSM.stateLife = 1
  957. o = self.FSM.owner
  958. o.header_text = "SelSou"
  959. o.pub.register("beat", self)
  960. draw_header(o)
  961. self.draw_square()
  962. o.update_display(0)
  963. super(SelectSound, self).Enter()
  964. def Execute(self):
  965. o = self.FSM.owner
  966. if o.keyState[16] == 1:
  967. draw_menu1(o)
  968. o.update_display(0)
  969. elif o.keyState[16] == 4:
  970. draw_header(o)
  971. self.draw_square()
  972. o.update_display(0)
  973. if o.keyState[16] == 2:
  974. if o.keyState[0] == 1:
  975. self.FSM.ToTransition('toMain')
  976. else:
  977. _id = 0
  978. for k in o.keyState:
  979. if _id > 15:
  980. pass
  981. else:
  982. if k == 1:
  983. o.eSound = _id
  984. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  985. o.draw.text((0, 0), "SelSou", font=o.h1, fill=o.light_blue)
  986. o.draw.text((20, 60), str(o.eSound), font=o.h2, fill=o.light_grey)
  987. self.draw_square()
  988. o.update_display(0)
  989. self.FSM.owner.soundSlots[_id].play()
  990. #print('now editing sound ', _id)
  991. _id += 1
  992. def ReceiveMessage(self, message):
  993. _id = 0
  994. o = self.FSM.owner
  995. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=(0, 0, 0))
  996. o.draw.text((0, 0), "SelSou", font=o.h1, fill="#FFFFFF")
  997. o.draw.text((0, 20), str(o.eSound), font=o.h2, fill="#FFFFFF")
  998. o.update_display(0)
  999. play_seq(o, message)
  1000. def draw_square(self):
  1001. o = self.FSM.owner
  1002. size = 32
  1003. og_x = 110
  1004. o_x = og_x
  1005. o_y = 0
  1006. _id = 0
  1007. for n in o.soundSlots[o.eSound].notes[o.ePattern]:
  1008. if _id == o.eSound:
  1009. o.draw.rectangle((o_x, o_y, o_x + size, o_y + size), outline=0, fill=o.light_grey)
  1010. else:
  1011. o.draw.rectangle((o_x, o_y, o_x + size, o_y + size), outline=0, fill=o.dark_grey)
  1012. o_x = o_x + size
  1013. _id += 1
  1014. if _id % 4 == 0:
  1015. o_y += size
  1016. o_x = og_x
  1017. def Exit(self):
  1018. self.FSM.owner.pub.unregister("beat", self)
  1019. #====================================
  1020. class SelectPattern(State):
  1021. def __init__(self,FSM):
  1022. super(SelectPattern, self).__init__(FSM)
  1023. def Enter(self):
  1024. self.FSM.stateLife = 1
  1025. o = self.FSM.owner
  1026. o.header_text = "Select Pattern"
  1027. o.pub.register("beat", self)
  1028. self.cur_playing = 0
  1029. self.active_patterns = []
  1030. self.get_active_patterns(o)
  1031. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1032. pass
  1033. else:
  1034. draw_header(o)
  1035. self.draw_square()
  1036. text_box1(o, "Pat", str(o.ePattern))
  1037. text_box4(o, "Bank", str(o.pat_bank))
  1038. o.update_display(0)
  1039. super(SelectPattern, self).Enter()
  1040. def Execute(self):
  1041. o = self.FSM.owner
  1042. menu1_actions(self, o)
  1043. menu2_actions_pattern(self, o)
  1044. if o.keyState[16] == 1:
  1045. draw_menu1(o)
  1046. o.update_display(0)
  1047. elif o.keyState[16] == 4:
  1048. draw_header(o)
  1049. self.draw_square()
  1050. text_box1(o, "Pat", str(o.ePattern))
  1051. text_box4(o, "Bank", str(o.pat_bank))
  1052. o.update_display(0)
  1053. if o.keyState[17] == 1:
  1054. draw_menu2_pattern(o)
  1055. o.update_display(0)
  1056. elif o.keyState[17] == 4:
  1057. draw_header(o)
  1058. self.get_active_patterns(o)
  1059. self.draw_square()
  1060. text_box1(o, "Pat", str(o.ePattern))
  1061. text_box4(o, "Bank", str(o.pat_bank))
  1062. o.update_display(0)
  1063. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1064. pass
  1065. else:
  1066. _id = 0
  1067. for k in o.keyState:
  1068. if _id > 15:
  1069. pass
  1070. else:
  1071. if k == 1:
  1072. o.ePattern = (o.pat_bank * 16) +_id
  1073. draw_header(o)
  1074. self.draw_square()
  1075. text_box1(o, "Pat", str(o.ePattern))
  1076. text_box4(o, "Bank", str(o.pat_bank))
  1077. o.update_display(0)
  1078. _id += 1
  1079. def ReceiveMessage(self, message):
  1080. o = self.FSM.owner
  1081. play_seq(o, message)
  1082. if message[0] != self.cur_playing:
  1083. #print('playing ', message)
  1084. self.cur_playing = message[0]
  1085. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1086. pass
  1087. else:
  1088. draw_header(o)
  1089. self.draw_square()
  1090. text_box1(o, "Pat", str(o.ePattern))
  1091. text_box4(o, "Bank", str(o.pat_bank))
  1092. o.update_display(0)
  1093. def draw_square(self):
  1094. o = self.FSM.owner
  1095. size = 22
  1096. og_x = (o.width / 2) - (size * 2)
  1097. o_x = og_x
  1098. o_y = 127
  1099. _id = 0
  1100. for n in o.soundSlots[o.eSound].notes[o.ePattern]:
  1101. if (_id + (o.pat_bank * 16)) == o.ePattern:
  1102. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.olive, width=1)
  1103. elif (_id + (o.pat_bank * 16)) == self.cur_playing:
  1104. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.light_grey, width=1)
  1105. elif self.active_patterns[_id] == 1:
  1106. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.blue, width=1)
  1107. else:
  1108. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.dark_grey, width=1)
  1109. o_x = o_x + size
  1110. _id += 1
  1111. if _id % 4 == 0:
  1112. o_y -= size
  1113. o_x = og_x
  1114. def get_active_patterns(self, o):
  1115. #for n in o.soundSlots[o.eSound]
  1116. self.active_patterns = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
  1117. pat_iter = o.pat_bank * 16
  1118. _iter = 0
  1119. print('is this note on? ', o.soundSlots[0].notes[0][0][0])
  1120. while pat_iter < ((o.pat_bank * 16) + 16):
  1121. for s in o.soundSlots:
  1122. print('checking soundSlot ', s.id)
  1123. pat_used = 0
  1124. for p in s.notes[pat_iter]:
  1125. if self.active_patterns[_iter] == 1:
  1126. break
  1127. if p[0] == 1:
  1128. #pat_used = 1
  1129. self.active_patterns[_iter] = 1
  1130. print('found ', pat_iter, ' -- ', p[0])
  1131. break
  1132. #self.active_patterns.append(pat_used)
  1133. pat_iter += 1
  1134. _iter += 1
  1135. print('active patterns ', self.active_patterns)
  1136. def Exit(self):
  1137. self.FSM.owner.pub.unregister("beat", self)
  1138. #====================================
  1139. class EditSoundSequence(State):
  1140. def __init__(self,FSM):
  1141. super(EditSoundSequence, self).__init__(FSM)
  1142. def Enter(self):
  1143. self.FSM.stateLife = 1
  1144. o = self.FSM.owner
  1145. o.header_text = "Note Edit"
  1146. o.pub.register("beat", self)
  1147. self.curPattern = o.ePattern
  1148. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1149. pass
  1150. else:
  1151. draw_header(o)
  1152. self.draw_square()
  1153. text_box1(o, "Note Vol", str(o.note_vol))
  1154. text_box3(o, "Pat", str(self.curPattern))
  1155. o.update_display(0)
  1156. super(EditSoundSequence, self).Enter()
  1157. def Execute(self):
  1158. o = self.FSM.owner
  1159. menu1_actions(self, o)
  1160. menu2_actions_note(self, o)
  1161. if o.keyState[16] == 1:
  1162. draw_menu1(o)
  1163. o.update_display(0)
  1164. elif o.keyState[16] == 4:
  1165. draw_header(o)
  1166. self.draw_square()
  1167. text_box1(o, "Note Vol", str(o.note_vol))
  1168. text_box3(o, "Pat", str(self.curPattern))
  1169. o.update_display(0)
  1170. if o.keyState[17] == 1:
  1171. draw_menu2_note(o)
  1172. o.update_display(0)
  1173. elif o.keyState[17] == 4:
  1174. draw_header(o)
  1175. self.draw_square()
  1176. text_box1(o, "Note Vol", str(o.note_vol))
  1177. text_box3(o, "Pat", str(self.curPattern))
  1178. o.update_display(0)
  1179. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1180. pass
  1181. else:
  1182. _id = 0
  1183. for k in self.FSM.owner.keyState:
  1184. if _id < 16 and k == 1:
  1185. if o.soundSlots[o.eSound].notes[self.curPattern][_id][0] == 1:
  1186. print('turn note off')
  1187. o.soundSlots[o.eSound].notes[self.curPattern][_id][0] = 0
  1188. o.soundSlots[o.eSound].notes[self.curPattern][_id][1] = 0
  1189. else:
  1190. print('turn note on')
  1191. o.soundSlots[o.eSound].notes[self.curPattern][_id][0] = 1
  1192. o.soundSlots[o.eSound].notes[self.curPattern][_id][1] = o.note_vol
  1193. draw_header(o)
  1194. self.draw_square()
  1195. text_box1(o, "Note Vol", str(o.note_vol))
  1196. text_box3(o, "Pat", str(self.curPattern))
  1197. o.update_display(0)
  1198. _id += 1
  1199. def draw_square(self):
  1200. o = self.FSM.owner
  1201. size = 22
  1202. og_x = (o.width / 2) - (size * 2)
  1203. o_x = og_x
  1204. o_y = 127
  1205. _id = 0
  1206. for n in o.soundSlots[o.eSound].notes[self.curPattern]:
  1207. if _id == o.playhead and o.playing:
  1208. if o.curPattern == self.curPattern:
  1209. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.olive, width=1)
  1210. else:
  1211. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.pink, width=1)
  1212. elif n[0] == 1:
  1213. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.light_grey, width=1)
  1214. else:
  1215. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.blue, width=1)
  1216. o_x = o_x + size
  1217. _id += 1
  1218. if _id % 4 == 0:
  1219. o_y -= size
  1220. o_x = og_x
  1221. def ReceiveMessage(self, message):
  1222. _id = 0
  1223. o = self.FSM.owner
  1224. play_seq(o, message)
  1225. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1226. pass
  1227. else:
  1228. draw_header(o)
  1229. self.draw_square()
  1230. text_box1(o, "Note Vol", str(o.note_vol))
  1231. text_box3(o, "Pat", str(self.curPattern))
  1232. if o.patternFollow:
  1233. self.curPattern = message[0]
  1234. else:
  1235. self.curPattern = o.ePattern
  1236. print('message ', message)
  1237. o.update_display(0)
  1238. def Exit(self):
  1239. self.FSM.owner.pub.unregister("beat", self)
  1240. class EditSong(State):
  1241. def __init__(self,FSM):
  1242. super(EditSong, self).__init__(FSM)
  1243. def Enter(self):
  1244. o = self.FSM.owner
  1245. o.header_text = "Edit Song"
  1246. o.pub.register("beat", self)
  1247. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1248. pass
  1249. else:
  1250. draw_header(o)
  1251. self.draw_main(o)
  1252. # o.draw.text((20, 30), "Current Song", font=o.h2, fill=o.light_grey)
  1253. # o.draw.text((20, 50), str(o.song), font=o.h2, fill=o.light_grey)
  1254. o.update_display(0)
  1255. self.new_song = []
  1256. super(EditSong, self).Enter()
  1257. def Execute(self):
  1258. o = self.FSM.owner
  1259. menu1_actions(self, o)
  1260. menu2_actions_song(self, o)
  1261. if o.keyState[16] == 1:
  1262. draw_menu1(o)
  1263. o.update_display(0)
  1264. elif o.keyState[16] == 4:
  1265. draw_header(o)
  1266. self.draw_main(o)
  1267. # if self.new_song == []:
  1268. # o.draw.text((20, 30), "Current Song", font=o.h2, fill=o.light_grey)
  1269. # o.draw.text((20, 50), str(o.song), font=o.h2, fill=o.light_grey)
  1270. # else:
  1271. # o.draw.text((20, 30), "New Song", font=o.h2, fill=o.pink)
  1272. # o.draw.text((20, 50), str(self.new_song), font=o.h2, fill=o.pink)
  1273. o.update_display(0)
  1274. if o.keyState[17] == 1:
  1275. draw_menu2_song(o)
  1276. o.update_display(0)
  1277. elif o.keyState[17] == 4:
  1278. draw_header(o)
  1279. self.draw_main(o)
  1280. o.update_display(0)
  1281. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1282. #if o.keyState[16] > 0:
  1283. pass
  1284. else:
  1285. _id = 0
  1286. for k in self.FSM.owner.keyState:
  1287. if k == 1 and _id < 16:
  1288. self.new_song.append((_id + (o.pat_bank * 16)))
  1289. draw_header(o)
  1290. self.draw_main(o)
  1291. #o.draw.text((20, 30), "New Song", font=o.h2, fill=o.pink)
  1292. #o.draw.text((20, 50), str(self.new_song), font=o.h2, fill=o.pink)
  1293. o.update_display(0)
  1294. _id += 1
  1295. def draw_main(self, o):
  1296. ypos = 35
  1297. ysize = 20
  1298. tmp_song = [8, 6, 7, 5, 3, 0, 9]
  1299. lines = breakup_song_text(o.song)
  1300. #lines = breakup_song_text(tmp_song)
  1301. if self.new_song != []:
  1302. #o.draw.text((20, 30), "New Song", font=o.h2, fill=o.pink)
  1303. lines = breakup_song_text(self.new_song)
  1304. o.center_block("New Song", o.h2, [0, ypos, o.width, ypos + ysize], o.pink)
  1305. else:
  1306. #o.draw.text((20, 30), "Current Song", font=o.h2, fill=o.light_grey)
  1307. o.center_block("Current Song", o.h2, [0, ypos, o.width, ypos + ysize], o.light_grey)
  1308. ypos += ysize
  1309. o.center_block(lines[0], o.h2, [0, ypos, o.width, ypos + ysize], o.light_grey)
  1310. ypos += ysize
  1311. o.center_block(lines[1], o.h2, [0, ypos, o.width, ypos + ysize], o.light_grey)
  1312. ypos += ysize
  1313. o.center_block(lines[2], o.h2, [0, ypos, o.width, ypos + ysize], o.light_grey)
  1314. ypos += ysize
  1315. o.center_block(lines[3], o.h2, [0, ypos, o.width, ypos + ysize], o.light_grey)
  1316. def ReceiveMessage(self, message):
  1317. _id = 0
  1318. o = self.FSM.owner
  1319. play_seq(o, message)
  1320. def Exit(self):
  1321. o = self.FSM.owner
  1322. self.FSM.owner.pub.unregister("beat", self)
  1323. if self.new_song != []:
  1324. o.song = self.new_song
  1325. o.songCycle = cycle(self.new_song)
  1326. self.curPattern = next(o.songCycle)
  1327. o.songStart = o.curPattern
  1328. #====================================
  1329. class File(State):
  1330. def __init__(self,FSM):
  1331. super(File, self).__init__(FSM)
  1332. def Enter(self):
  1333. self.FSM.stateLife = 1
  1334. o = self.FSM.owner
  1335. o.header_text = "File"
  1336. o.pub.register("beat", self)
  1337. self.cur_el = 0
  1338. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1339. pass
  1340. else:
  1341. draw_header(o)
  1342. self.draw_footer(o)
  1343. self.draw_main(o)
  1344. o.update_display(0)
  1345. self.menu = ["Save", "Save As", "Open", "New"]
  1346. super(File, self).Enter()
  1347. def Execute(self):
  1348. o = self.FSM.owner
  1349. menu1_actions(self, o)
  1350. if o.keyState[16] == 1:
  1351. draw_menu1(o)
  1352. #self.draw_footer(o)
  1353. o.update_display(0)
  1354. elif o.keyState[16] == 4:
  1355. draw_header(o)
  1356. self.draw_footer(o)
  1357. self.draw_main(o)
  1358. o.update_display(0)
  1359. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  1360. draw_header(o)
  1361. self.draw_footer(o)
  1362. self.draw_main(o)
  1363. o.update_display(0)
  1364. print('draw butt')
  1365. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1366. pass
  1367. else:
  1368. if o.keyState[0] == 1:
  1369. if self.cur_el > 0:
  1370. self.cur_el -= 1
  1371. print('cur el down is ', self.cur_el)
  1372. if o.keyState[1] == 1:
  1373. if self.cur_el < (len(self.menu) - 1):
  1374. self.cur_el += 1
  1375. print('cur el up is ', self.cur_el)
  1376. if o.keyState[3] == 1:
  1377. file_command(self, o, self.menu[self.cur_el])
  1378. pass
  1379. def draw_footer(self, o):
  1380. _iter = 0
  1381. width = o.width / 4
  1382. xpos = 0
  1383. yposa = 135 - 25
  1384. yposb = 135
  1385. opts = ["Up", "Down", "Esc", "OK"]
  1386. while _iter < 4:
  1387. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  1388. if o.keyState[_iter] == 1:
  1389. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  1390. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  1391. else:
  1392. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  1393. xpos += width
  1394. _iter += 1
  1395. def draw_main(self, o):
  1396. al = []
  1397. ypos = 30
  1398. if self.cur_el == 0:
  1399. _iter = 0
  1400. while len(al) < 4:
  1401. al.append(self.menu[_iter])
  1402. _iter += 1
  1403. elif self.cur_el == 1:
  1404. al.append(self.menu[self.cur_el - 1])
  1405. al.append(self.menu[self.cur_el])
  1406. al.append(self.menu[self.cur_el + 1])
  1407. al.append(self.menu[self.cur_el + 2])
  1408. elif self.cur_el == (len(self.menu) - 2):
  1409. al.append(self.menu[self.cur_el - 2])
  1410. al.append(self.menu[self.cur_el - 1])
  1411. al.append(self.menu[self.cur_el])
  1412. al.append(self.menu[self.cur_el + 1])
  1413. elif self.cur_el == (len(self.menu) - 1):
  1414. al.append(self.menu[self.cur_el - 3])
  1415. al.append(self.menu[self.cur_el - 2])
  1416. al.append(self.menu[self.cur_el - 1])
  1417. al.append(self.menu[self.cur_el])
  1418. else:
  1419. al.append(self.menu[self.cur_el - 1])
  1420. al.append(self.menu[self.cur_el])
  1421. al.append(self.menu[self.cur_el + 1])
  1422. al.append(self.menu[self.cur_el + 2])
  1423. _iter = 0
  1424. for i in al:
  1425. if i == self.menu[self.cur_el]:
  1426. #if _iter == self.cur_el:
  1427. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  1428. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  1429. else:
  1430. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  1431. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  1432. ypos += 20
  1433. _iter += 1
  1434. def ReceiveMessage(self, message):
  1435. o = self.FSM.owner
  1436. play_seq(o, message)
  1437. def Exit(self):
  1438. self.FSM.owner.pub.unregister("beat", self)
  1439. class Util(State):
  1440. def __init__(self,FSM):
  1441. super(Util, self).__init__(FSM)
  1442. def Enter(self):
  1443. o = self.FSM.owner
  1444. o.header_text = "Utilities"
  1445. o.pub.register("beat", self)
  1446. self.menu = ["Clock", "Balls", "Defender", "Calculator", "Exit", "Shutdown", "Reboot", "Theme", "Ping", "Wifi", "Update"]
  1447. self.cur_el = 0
  1448. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1449. pass
  1450. else:
  1451. draw_header(o)
  1452. self.draw_footer(o)
  1453. self.draw_main(o)
  1454. o.update_display(0)
  1455. super(Util, self).Enter()
  1456. def Execute(self):
  1457. o = self.FSM.owner
  1458. menu1_actions(self, o)
  1459. if o.keyState[16] == 1:
  1460. draw_menu1(o)
  1461. o.update_display(0)
  1462. elif o.keyState[16] == 4:
  1463. draw_header(o)
  1464. self.draw_footer(o)
  1465. self.draw_main(o)
  1466. o.update_display(0)
  1467. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  1468. draw_header(o)
  1469. self.draw_footer(o)
  1470. self.draw_main(o)
  1471. o.update_display(0)
  1472. print('draw butt')
  1473. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1474. pass
  1475. else:
  1476. if o.keyState[0] == 1:
  1477. if self.cur_el > 0:
  1478. self.cur_el -= 1
  1479. print('cur el down is ', self.cur_el)
  1480. if o.keyState[1] == 1:
  1481. if self.cur_el < (len(self.menu) - 1):
  1482. self.cur_el += 1
  1483. print('cur el up is ', self.cur_el)
  1484. if o.keyState[3] == 1:
  1485. util_command(self, o, self.menu[self.cur_el])
  1486. def ReceiveMessage(self, message):
  1487. _id = 0
  1488. o = self.FSM.owner
  1489. play_seq(o, message)
  1490. # if o.keyState[16] > 0 or o.keyState[17] > 0:
  1491. # pass
  1492. # else:
  1493. # draw_header(o)
  1494. # o.update_display(0)
  1495. def draw_main(self, o):
  1496. al = []
  1497. ypos = 30
  1498. if self.cur_el == 0:
  1499. _iter = 0
  1500. while len(al) < 4:
  1501. al.append(self.menu[_iter])
  1502. _iter += 1
  1503. elif self.cur_el == 1:
  1504. al.append(self.menu[self.cur_el - 1])
  1505. al.append(self.menu[self.cur_el])
  1506. al.append(self.menu[self.cur_el + 1])
  1507. al.append(self.menu[self.cur_el + 2])
  1508. elif self.cur_el == (len(self.menu) - 2):
  1509. al.append(self.menu[self.cur_el - 2])
  1510. al.append(self.menu[self.cur_el - 1])
  1511. al.append(self.menu[self.cur_el])
  1512. al.append(self.menu[self.cur_el + 1])
  1513. elif self.cur_el == (len(self.menu) - 1):
  1514. al.append(self.menu[self.cur_el - 3])
  1515. al.append(self.menu[self.cur_el - 2])
  1516. al.append(self.menu[self.cur_el - 1])
  1517. al.append(self.menu[self.cur_el])
  1518. else:
  1519. al.append(self.menu[self.cur_el - 1])
  1520. al.append(self.menu[self.cur_el])
  1521. al.append(self.menu[self.cur_el + 1])
  1522. al.append(self.menu[self.cur_el + 2])
  1523. _iter = 0
  1524. for i in al:
  1525. if i == self.menu[self.cur_el]:
  1526. #if _iter == self.cur_el:
  1527. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  1528. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  1529. else:
  1530. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  1531. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  1532. ypos += 20
  1533. _iter += 1
  1534. def draw_footer(self, o):
  1535. _iter = 0
  1536. width = o.width / 4
  1537. xpos = 0
  1538. yposa = 135 - 25
  1539. yposb = 135
  1540. opts = ["Up", "Down", "Esc", "OK"]
  1541. while _iter < 4:
  1542. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  1543. if o.keyState[_iter] == 1:
  1544. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  1545. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  1546. else:
  1547. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  1548. xpos += width
  1549. _iter += 1
  1550. def Exit(self):
  1551. self.FSM.owner.pub.unregister("beat", self)
  1552. class Ball(State):
  1553. def __init__(self,FSM):
  1554. super(Ball, self).__init__(FSM)
  1555. def Enter(self):
  1556. self.ball_size = 10
  1557. self.ballx = self.ball_size
  1558. self.bally = self.ball_size
  1559. self.ball_speed = 8
  1560. self.ball_x_dir = 1
  1561. self.ball_y_dir = 1
  1562. self.ball2x = self.ball_size + 180
  1563. self.ball2y = self.ball_size + 70
  1564. self.ball2_x_dir = -1
  1565. self.ball2_y_dir = -1
  1566. self.xmult = 1.0
  1567. o = self.FSM.owner
  1568. o.header_text = "Balls"
  1569. o.pub.register("beat", self)
  1570. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1571. pass
  1572. else:
  1573. draw_header(o)
  1574. o.update_display(0)
  1575. super(Ball, self).Enter()
  1576. def Execute(self):
  1577. o = self.FSM.owner
  1578. menu1_actions(self, o)
  1579. if o.keyState[16] == 1:
  1580. draw_menu1(o)
  1581. o.update_display(0)
  1582. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1583. pass
  1584. else:
  1585. now = datetime.now()
  1586. current_time = time.strftime("%-I:%M %p")
  1587. if self.ballx < (0 + self.ball_size):
  1588. self.ball_x_dir = 1
  1589. if self.ballx > (o.width - self.ball_size):
  1590. self.ball_x_dir = -1
  1591. if self.bally < (0 + self.ball_size):
  1592. self.ball_y_dir = 1
  1593. if self.bally > (o.height - self.ball_size):
  1594. self.ball_y_dir = -1
  1595. # if self.ballx > (o.width - self.ball_size) or self.ballx < (0 + self.ball_size):
  1596. # self.ball_x_dir *= -1
  1597. # if self.bally > (o.height - self.ball_size) or self.bally < (0 + self.ball_size):
  1598. # self.ball_y_dir *= -1
  1599. self.ballx += self.ball_speed * self.ball_x_dir
  1600. self.bally += self.ball_speed * self.ball_y_dir
  1601. if self.ball2x < (0 + self.ball_size):
  1602. self.ball2_x_dir = 1
  1603. self.xmult = random.uniform(.6, 1.2)
  1604. if self.ball2x > (o.width - self.ball_size):
  1605. self.ball2_x_dir = -1
  1606. self.xmult = random.uniform(.6, 1.2)
  1607. if self.ball2y < (0 + self.ball_size):
  1608. self.ball2_y_dir = 1
  1609. if self.ball2y > (o.height - self.ball_size):
  1610. self.ball2_y_dir = -1
  1611. # if self.ball2x > (o.width - self.ball_size) or self.ball2x < (0 + self.ball_size):
  1612. # self.ball2_x_dir *= -1
  1613. # self.xmult = random.uniform(.8, 1.2)
  1614. # if self.ball2y > (o.height - self.ball_size) or self.ball2y < (0 + self.ball_size):
  1615. # self.ball2_y_dir *= -1
  1616. self.ball2x += (self.ball_speed * self.ball2_x_dir) * self.xmult
  1617. self.ball2y += (self.ball_speed * self.ball2_y_dir)
  1618. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  1619. o.draw.ellipse((self.ballx - self.ball_size, self.bally - self.ball_size, self.ballx + self.ball_size, self.bally + self.ball_size), fill = o.light_grey, outline =o.light_grey)
  1620. o.draw.ellipse((self.ball2x - self.ball_size, self.ball2y - self.ball_size, self.ball2x + self.ball_size, self.ball2y + self.ball_size), fill = o.light_grey, outline =o.light_grey)
  1621. #o.center_block(current_time, o.h3, [0,0,o.width,o.height], o.pink)
  1622. o.update_display(0)
  1623. def ReceiveMessage(self, message):
  1624. o = self.FSM.owner
  1625. play_seq(o, message)
  1626. def Exit(self):
  1627. self.FSM.owner.pub.unregister("beat", self)
  1628. #====================================
  1629. class Clock(State):
  1630. def __init__(self,FSM):
  1631. super(Clock, self).__init__(FSM)
  1632. def Enter(self):
  1633. o = self.FSM.owner
  1634. current_time = time.strftime("%-I:%M:%S")
  1635. self.ball_sizex, self.ball_sizey = o.h3.getsize("18:88:88")
  1636. self.ball_sizex /= 2
  1637. self.ball_sizey /= 2
  1638. #self.ball_sizey += 10
  1639. self.ballx = o.width / 2
  1640. self.bally = o.height / 2
  1641. self.ball_speed = .5
  1642. self.ball_x_dir = 1
  1643. self.ball_y_dir = 1
  1644. o.header_text = "Clock"
  1645. o.pub.register("beat", self)
  1646. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1647. pass
  1648. else:
  1649. pass
  1650. super(Clock, self).Enter()
  1651. def Execute(self):
  1652. o = self.FSM.owner
  1653. menu1_actions(self, o)
  1654. if o.keyState[16] == 1:
  1655. draw_menu1(o)
  1656. o.update_display(0)
  1657. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1658. pass
  1659. else:
  1660. current_time = time.strftime("%-I:%M:%S")
  1661. s = int(time.strftime("%S"))
  1662. if s % 2 == 0:
  1663. current_time = time.strftime("%-I:%M.%S")
  1664. if self.ballx > (o.width - self.ball_sizex) or self.ballx < (0 + self.ball_sizex):
  1665. self.ball_x_dir *= -1
  1666. if (self.bally > o.height - self.ball_sizey - 20) or (self.bally < 0 + self.ball_sizey):
  1667. self.ball_y_dir *= -1
  1668. x1 = self.ballx - self.ball_sizex
  1669. x2 = self.ballx + self.ball_sizex
  1670. y1 = self.bally - self.ball_sizey
  1671. y2 = self.bally + self.ball_sizey
  1672. self.ballx += self.ball_speed * self.ball_x_dir
  1673. self.bally += self.ball_speed * self.ball_y_dir
  1674. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  1675. #o.draw.rectangle((x1, y1, x2, y2), outline=0, fill=o.dark_grey)
  1676. #o.draw.text((self.ballx - self.ball_sizex, self.bally - self.ball_sizey), current_time, align='center', font=o.h3, fill=o.light_grey)
  1677. o.center_block(current_time, o.h3, [x1, y1, x2, y2], o.light_grey)
  1678. today = date.today()
  1679. current_date = today.strftime('%A')
  1680. current_date += ', ' + today.strftime("%b %d, %Y")
  1681. #o.draw.text((self.ballx - self.ball_sizex, (self.bally + 45) - self.ball_sizey), current_date, align='center', font=o.h2, fill=o.light_grey)
  1682. o.center_block(current_date, o.h2, [x1, y1 + 35, x2, y2 + 35], o.light_grey)
  1683. o.update_display(0)
  1684. def ReceiveMessage(self, message):
  1685. o = self.FSM.owner
  1686. play_seq(o, message)
  1687. def Exit(self):
  1688. self.FSM.owner.pub.unregister("beat", self)
  1689. #====================================
  1690. class Exit(State):
  1691. def __init__(self,FSM):
  1692. super(Exit, self).__init__(FSM)
  1693. def Enter(self):
  1694. o = self.FSM.owner
  1695. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  1696. o.center_block("goodbye", o.h2, [0, 0, o.width,o.height], o.light_grey)
  1697. o.update_display(0)
  1698. pygame.quit()
  1699. sys.exit()
  1700. super(Exit, self).Enter()
  1701. def Execute(self):
  1702. self.FSM.stateLife += 1
  1703. def Exit(self):
  1704. pass
  1705. #====================================
  1706. #====================================
  1707. class Reboot(State):
  1708. def __init__(self,FSM):
  1709. super(Reboot, self).__init__(FSM)
  1710. def Enter(self):
  1711. o = self.FSM.owner
  1712. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  1713. o.center_block("rebooting", o.h2, [0, 0, o.width,o.height], o.light_grey)
  1714. o.update_display(0)
  1715. command = 'bash -c "sleep 5; sudo shutdown -r now"&'
  1716. os.system(command)
  1717. pygame.quit()
  1718. sys.exit()
  1719. super(Reboot, self).Enter()
  1720. def Execute(self):
  1721. pass
  1722. #self.FSM.stateLife += 1
  1723. #os.system('sudo shutdown -r now')
  1724. def Exit(self):
  1725. pass
  1726. #====================================
  1727. #====================================
  1728. class Shutdown(State):
  1729. def __init__(self,FSM):
  1730. super(Shutdown, self).__init__(FSM)
  1731. def Enter(self):
  1732. o = self.FSM.owner
  1733. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  1734. o.center_block("shutting down", o.h2, [0, 0, o.width,o.height - 20], o.light_grey)
  1735. o.center_block("(unplug in 20s)", o.h2, [0, 10, o.width,o.height+10], o.light_grey)
  1736. o.center_block("thank you for playing", o.h2, [0, 30, o.width,o.height+30], o.light_grey)
  1737. o.update_display(0)
  1738. command = 'bash -c "sleep 5; sudo shutdown -h now"&'
  1739. os.system(command)
  1740. pygame.quit()
  1741. sys.exit()
  1742. super(Shutdown, self).Enter()
  1743. def Execute(self):
  1744. pass
  1745. #self.FSM.stateLife += 1
  1746. #os.system('sudo shutdown -r now')
  1747. def Exit(self):
  1748. pass
  1749. #====================================
  1750. class SelTheme(State):
  1751. def __init__(self,FSM):
  1752. super(SelTheme, self).__init__(FSM)
  1753. def Enter(self):
  1754. o = self.FSM.owner
  1755. o.header_text = "Select Theme"
  1756. o.pub.register("beat", self)
  1757. self.cur_el = 0
  1758. self.globbed = glob.glob('/home/pi/zpc_ct/user/themes/*.thm')
  1759. self.globbed.sort()
  1760. self.names = [os.path.basename(x) for x in self.globbed]
  1761. self.names = [os.path.splitext(x)[0] for x in self.names]
  1762. if o.mconf['theme'] in self.names:
  1763. _id = self.names.index(o.mconf['theme'])
  1764. self.cur_el = _id
  1765. #print('found theme ', _id)
  1766. else:
  1767. print('nope ', o.mconf['theme'], ' - ', self.globbed)
  1768. #self.theme = ConfigObj("/home/pi/zpc_ct/themes/" + self.mconf['theme'])
  1769. #print(os.path.splitext(x)[0])
  1770. self.menu = self.names
  1771. #self.cur_el = 0
  1772. print('theme menu is ', self.menu)
  1773. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1774. pass
  1775. else:
  1776. draw_header(o)
  1777. self.draw_main(o)
  1778. o.update_display(0)
  1779. super(SelTheme, self).Enter()
  1780. def Execute(self):
  1781. o = self.FSM.owner
  1782. menu1_actions(self, o)
  1783. if o.keyState[16] == 1:
  1784. draw_menu1(o)
  1785. o.update_display(0)
  1786. elif o.keyState[16] == 4:
  1787. draw_header(o)
  1788. self.draw_footer(o)
  1789. self.draw_main(o)
  1790. o.update_display(0)
  1791. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  1792. draw_header(o)
  1793. self.draw_footer(o)
  1794. self.draw_main(o)
  1795. o.update_display(0)
  1796. print('draw butt')
  1797. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1798. pass
  1799. else:
  1800. if o.keyState[0] == 1:
  1801. if self.cur_el > 0:
  1802. self.cur_el -= 1
  1803. o.mconf['theme'] = self.menu[self.cur_el]
  1804. o.save_config()
  1805. o.load_config()
  1806. o.apply_theme()
  1807. print('cur el down is ', self.cur_el)
  1808. #o.applyTheme
  1809. if o.keyState[1] == 1:
  1810. if self.cur_el < (len(self.menu) - 1):
  1811. self.cur_el += 1
  1812. o.mconf['theme'] = self.menu[self.cur_el]
  1813. o.save_config()
  1814. o.load_config()
  1815. o.apply_theme()
  1816. print('cur el up is ', self.cur_el)
  1817. print('loading theme ', self.menu[self.cur_el], '-- ', o.mconf['theme'])
  1818. if o.keyState[3] == 1:
  1819. util_command(self, o, self.menu[self.cur_el])
  1820. def draw_main(self, o):
  1821. al = []
  1822. ypos = 30
  1823. if self.cur_el == 0:
  1824. _iter = 0
  1825. while len(al) < 4:
  1826. al.append(self.menu[_iter])
  1827. _iter += 1
  1828. elif self.cur_el == 1:
  1829. al.append(self.menu[self.cur_el - 1])
  1830. al.append(self.menu[self.cur_el])
  1831. al.append(self.menu[self.cur_el + 1])
  1832. al.append(self.menu[self.cur_el + 2])
  1833. elif self.cur_el == (len(self.menu) - 2):
  1834. al.append(self.menu[self.cur_el - 2])
  1835. al.append(self.menu[self.cur_el - 1])
  1836. al.append(self.menu[self.cur_el])
  1837. al.append(self.menu[self.cur_el + 1])
  1838. elif self.cur_el == (len(self.menu) - 1):
  1839. al.append(self.menu[self.cur_el - 3])
  1840. al.append(self.menu[self.cur_el - 2])
  1841. al.append(self.menu[self.cur_el - 1])
  1842. al.append(self.menu[self.cur_el])
  1843. else:
  1844. al.append(self.menu[self.cur_el - 1])
  1845. al.append(self.menu[self.cur_el])
  1846. al.append(self.menu[self.cur_el + 1])
  1847. al.append(self.menu[self.cur_el + 2])
  1848. _iter = 0
  1849. for i in al:
  1850. if i == self.menu[self.cur_el]:
  1851. #if _iter == self.cur_el:
  1852. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  1853. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  1854. else:
  1855. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  1856. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  1857. ypos += 20
  1858. _iter += 1
  1859. def draw_footer(self, o):
  1860. _iter = 0
  1861. width = o.width / 4
  1862. xpos = 0
  1863. yposa = 135 - 25
  1864. yposb = 135
  1865. opts = ["Up", "Down", "", ""]
  1866. while _iter < 4:
  1867. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  1868. if o.keyState[_iter] == 1:
  1869. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  1870. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  1871. else:
  1872. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  1873. xpos += width
  1874. _iter += 1
  1875. def ReceiveMessage(self, message):
  1876. o = self.FSM.owner
  1877. play_seq(o, message)
  1878. def Exit(self):
  1879. self.FSM.owner.pub.unregister("beat", self)
  1880. #====================================
  1881. class OpenSong(State):
  1882. def __init__(self,FSM):
  1883. super(OpenSong, self).__init__(FSM)
  1884. def Enter(self):
  1885. o = self.FSM.owner
  1886. o.header_text = "Open Song"
  1887. o.pub.register("beat", self)
  1888. self.cur_el = 0
  1889. self.globbed = glob.glob('/home/pi/zpc_ct/user/songs/*.sng')
  1890. self.globbed.sort()
  1891. if '/home/pi/zpc_ct/user/songs/_blank.sng' in self.globbed:
  1892. self.globbed.remove('/home/pi/zpc_ct/user/songs/_blank.sng')
  1893. #del self.globbed[0]
  1894. self.names = [os.path.basename(x) for x in self.globbed]
  1895. self.names = [os.path.splitext(x)[0] for x in self.names]
  1896. print('we got these songs ', self.names)
  1897. print('in these paths ', self.globbed)
  1898. if o.mconf['default_song'] in self.names:
  1899. _id = self.names.index(o.mconf['default_song'])
  1900. self.cur_el = _id
  1901. else:
  1902. print('nope ', o.mconf['default_song'], ' - ', self.globbed)
  1903. self.menu = self.names
  1904. #self.cur_el = 0
  1905. #print('theme menu is ', self.menu)
  1906. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1907. pass
  1908. else:
  1909. draw_header(o)
  1910. self.draw_main(o)
  1911. o.update_display(0)
  1912. super(OpenSong, self).Enter()
  1913. def Execute(self):
  1914. o = self.FSM.owner
  1915. menu1_actions(self, o)
  1916. if o.keyState[16] == 1:
  1917. draw_menu1(o)
  1918. o.update_display(0)
  1919. elif o.keyState[16] == 4:
  1920. draw_header(o)
  1921. self.draw_footer(o)
  1922. self.draw_main(o)
  1923. o.update_display(0)
  1924. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  1925. draw_header(o)
  1926. self.draw_footer(o)
  1927. self.draw_main(o)
  1928. o.update_display(0)
  1929. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1930. pass
  1931. else:
  1932. if o.keyState[0] == 1:
  1933. if self.cur_el > 0:
  1934. self.cur_el -= 1
  1935. # o.mconf['theme'] = self.menu[self.cur_el]
  1936. # o.save_config()
  1937. # o.load_config()
  1938. # o.apply_theme()
  1939. print('cur el down is ', self.cur_el)
  1940. #o.applyTheme
  1941. if o.keyState[1] == 1:
  1942. if self.cur_el < (len(self.menu) - 1):
  1943. self.cur_el += 1
  1944. # o.mconf['theme'] = self.menu[self.cur_el]
  1945. # o.save_config()
  1946. # o.load_config()
  1947. # o.apply_theme()
  1948. print('cur el up is ', self.cur_el)
  1949. #print('loading theme ', self.menu[self.cur_el], '-- ', o.mconf['theme'])
  1950. if o.keyState[3] == 1:
  1951. #open_command(self, o, self.menu[self.cur_el])
  1952. o.mconf['default_song'] = self.menu[self.cur_el]
  1953. o.save_config()
  1954. o.load_song()
  1955. #pass
  1956. def draw_main(self, o):
  1957. al = []
  1958. ypos = 30
  1959. if self.cur_el == 0:
  1960. _iter = 0
  1961. while len(al) < 4:
  1962. al.append(self.menu[_iter])
  1963. _iter += 1
  1964. elif self.cur_el == 1:
  1965. al.append(self.menu[self.cur_el - 1])
  1966. al.append(self.menu[self.cur_el])
  1967. al.append(self.menu[self.cur_el + 1])
  1968. al.append(self.menu[self.cur_el + 2])
  1969. elif self.cur_el == (len(self.menu) - 2):
  1970. al.append(self.menu[self.cur_el - 2])
  1971. al.append(self.menu[self.cur_el - 1])
  1972. al.append(self.menu[self.cur_el])
  1973. al.append(self.menu[self.cur_el + 1])
  1974. elif self.cur_el == (len(self.menu) - 1):
  1975. al.append(self.menu[self.cur_el - 3])
  1976. al.append(self.menu[self.cur_el - 2])
  1977. al.append(self.menu[self.cur_el - 1])
  1978. al.append(self.menu[self.cur_el])
  1979. else:
  1980. al.append(self.menu[self.cur_el - 1])
  1981. al.append(self.menu[self.cur_el])
  1982. al.append(self.menu[self.cur_el + 1])
  1983. al.append(self.menu[self.cur_el + 2])
  1984. _iter = 0
  1985. for i in al:
  1986. if i == self.menu[self.cur_el]:
  1987. #if _iter == self.cur_el:
  1988. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  1989. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  1990. else:
  1991. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  1992. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  1993. ypos += 20
  1994. _iter += 1
  1995. def draw_footer(self, o):
  1996. _iter = 0
  1997. width = o.width / 4
  1998. xpos = 0
  1999. yposa = 135 - 25
  2000. yposb = 135
  2001. opts = ["Up", "Down", "Esc", "Open"]
  2002. while _iter < 4:
  2003. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  2004. if o.keyState[_iter] == 1:
  2005. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  2006. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  2007. else:
  2008. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  2009. xpos += width
  2010. _iter += 1
  2011. def ReceiveMessage(self, message):
  2012. o = self.FSM.owner
  2013. play_seq(o, message)
  2014. def Exit(self):
  2015. self.FSM.owner.pub.unregister("beat", self)
  2016. class EnterText(State):
  2017. def __init__(self,FSM):
  2018. super(EnterText, self).__init__(FSM)
  2019. def Enter(self):
  2020. o = self.FSM.owner
  2021. menu1_actions(self, o)
  2022. if o.keyState[16] == 1:
  2023. draw_menu1(o)
  2024. o.update_display(0)
  2025. elif o.keyState[16] == 4:
  2026. draw_header(o)
  2027. self.draw_footer(o)
  2028. self.draw_main(o)
  2029. o.update_display(0)
  2030. self.input_string = ""
  2031. if o.sconf['title'] == 'blank':
  2032. self.input_string += str(datetime.today().strftime('%Y%m%d'))
  2033. else:
  2034. self.input_string += o.sconf['title']
  2035. #if
  2036. o.header_text = "EnterText"
  2037. o.pub.register("beat", self)
  2038. self.last_action = pygame.time.get_ticks()
  2039. self.caps = False
  2040. self.cur_but = 18
  2041. self.cur_letter = ""
  2042. if o.keyState[16] > 0 or o.keyState[17] > 0:
  2043. pass
  2044. else:
  2045. pass
  2046. self.skips = [7, 3, 11, 12, 13, 14, 15]
  2047. self.lc_labels = [["p", "q", "r", "s"], ["t", "u", "v"], ["w", "x", "y", "z"], ["C", "A", "P", "S"],
  2048. ["g", "h", "i"], ["j", "k", "l"], ["m", "n", "o"], ["D", "E", "L"],
  2049. ["_", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-"], ["a", "b", "c"], ["d", "e", "f"], ["O", "K"],
  2050. [], [], [], []]
  2051. self.uc_labels = [["P", "Q", "R", "S"], ["T", "U", "V"], ["W", "X", "Y", "Z"], ["C", "A", "P", "S"],
  2052. ["G", "H", "I"], ["J", "K", "L"], ["M", "N", "O"], ["D", "E", "L"],
  2053. ["_", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-"], ["A", "B", "C"], ["D", "E", "F"], ["O", "K"],
  2054. [], [], [], []]
  2055. self.labels = self.lc_labels
  2056. #self.songCycle = cycle(self.song)
  2057. #self.curPattern = next(self.songCycle)
  2058. self.cycles = []
  2059. for l in self.labels:
  2060. self.cycles.append(cycle(l))
  2061. self.draw(o)
  2062. o.update_display(0)
  2063. super(EnterText, self).Enter()
  2064. def Execute(self):
  2065. o = self.FSM.owner
  2066. y_size = o.height / 4
  2067. if o.keyState[11] == 1:
  2068. if self.input_string != 'blank':
  2069. o.title = self.input_string
  2070. #o.bpm = o.sconf['bpm']
  2071. o.sconf['title'] = self.input_string
  2072. print('fsm saving')
  2073. o.save_song()
  2074. self.FSM.ToTransition('toFile')
  2075. if o.keyState[16] > 0 and o.keyState[17] > 0:
  2076. pass
  2077. else:
  2078. _iter = 0
  2079. for k in o.keyState:
  2080. if k == 1:
  2081. cur_time = pygame.time.get_ticks()
  2082. print(cur_time - self.last_action)
  2083. #print('cur letter ', next(self.cycles[_iter]))
  2084. if _iter not in self.skips:
  2085. self.last_action = cur_time
  2086. self.cur_letter = next(self.cycles[_iter])
  2087. self.cur_but = _iter
  2088. self.draw(o)
  2089. o.center_block(self.input_string + self.cur_letter, o.h2, [0, 0, o.width, y_size], o.light_grey)
  2090. if _iter == 7:
  2091. self.input_string = self.input_string[:-1]
  2092. #self.input_string = self.input_string.rstrip(self.input_string[-1])
  2093. print('deleting')
  2094. self.last_action = 100000000
  2095. self.draw(o)
  2096. o.center_block(self.input_string, o.h2, [0, 0, o.width, y_size], o.light_grey)
  2097. elif _iter == 3:
  2098. print('caps')
  2099. if self.caps:
  2100. self.caps = False
  2101. self.labels = self.lc_labels
  2102. else:
  2103. self.caps = True
  2104. self.labels = self.uc_labels
  2105. self.draw(o)
  2106. o.center_block(self.input_string, o.h2, [0, 0, o.width, y_size], o.light_grey)
  2107. self.cycles = []
  2108. for l in self.labels:
  2109. self.cycles.append(cycle(l))
  2110. o.update_display(0)
  2111. _iter += 1
  2112. cur_time = pygame.time.get_ticks()
  2113. delay = cur_time - self.last_action
  2114. if delay > 1000 and delay < 100000:
  2115. self.input_string += self.cur_letter
  2116. self.last_action = 100000000
  2117. self.reset_cycles()
  2118. self.draw(o)
  2119. o.center_block(self.input_string, o.h2, [0, 0, o.width, y_size], o.light_grey)
  2120. o.update_display(0)
  2121. def ReceiveMessage(self, message):
  2122. o = self.FSM.owner
  2123. play_seq(o, message)
  2124. def draw(self, o):
  2125. x_size = o.width / 4
  2126. y_size = o.height / 4
  2127. og_x = 0
  2128. o_x = og_x
  2129. o_y = o.height
  2130. text_padding = 6
  2131. _id = 0
  2132. while _id < 16:
  2133. lab = ""
  2134. for i in self.labels[_id]:
  2135. lab += i
  2136. if _id == 8:
  2137. lab = "_12"
  2138. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.blue)
  2139. o.center_block(lab, o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  2140. o_x = o_x + x_size
  2141. _id += 1
  2142. if _id % 4 == 0:
  2143. o_y -= y_size
  2144. o_x = og_x
  2145. o.draw.rectangle((0, 0, o.width, y_size), outline=0, fill=o.blue)
  2146. def reset_cycles(self):
  2147. self.cycles = []
  2148. for l in self.labels:
  2149. self.cycles.append(cycle(l))
  2150. def Exit(self):
  2151. self.FSM.owner.pub.unregister("beat", self)
  2152. #====================================
  2153. class LoadSound(State):
  2154. def __init__(self,FSM):
  2155. super(LoadSound, self).__init__(FSM)
  2156. def Enter(self):
  2157. o = self.FSM.owner
  2158. o.header_text = "Load Sound"
  2159. o.pub.register("beat", self)
  2160. self.cur_el = 0
  2161. self.press_ticks_up = None
  2162. self.press_ticks_down = None
  2163. self.menu = []
  2164. self.menu.append("..")
  2165. self.menu += self.get_file_list(o)
  2166. if o.last_load_sound_id != None and o.last_load_sound_id <= len(self.menu):
  2167. self.cur_el = o.last_load_sound_id
  2168. print('setting cur_el ', self.cur_el)
  2169. self.last_preview = None
  2170. if o.keyState[16] > 0 or o.keyState[17] > 0:
  2171. pass
  2172. else:
  2173. draw_header(o)
  2174. self.draw_main(o)
  2175. o.update_display(0)
  2176. super(LoadSound, self).Enter()
  2177. def Execute(self):
  2178. o = self.FSM.owner
  2179. menu1_actions(self, o)
  2180. if o.keyState[16] == 1:
  2181. draw_menu1(o)
  2182. o.update_display(0)
  2183. elif o.keyState[16] == 4:
  2184. draw_header(o)
  2185. self.draw_footer(o)
  2186. self.draw_main(o)
  2187. o.update_display(0)
  2188. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  2189. draw_header(o)
  2190. self.draw_footer(o)
  2191. self.draw_main(o)
  2192. o.update_display(0)
  2193. #print('draw butt')
  2194. if o.keyState[16] > 0 or o.keyState[17] > 0:
  2195. pass
  2196. else:
  2197. since_up = 0
  2198. if o.keyState[0] == 2:
  2199. if self.press_ticks_up == None:
  2200. self.press_ticks_up = pygame.time.get_ticks()
  2201. since_up = pygame.time.get_ticks() - self.press_ticks_up
  2202. else:
  2203. self.press_ticks_up = None
  2204. self.press_ticks_up = pygame.time.get_ticks()
  2205. if o.keyState[0] == 1 or since_up > 250:
  2206. if self.cur_el > 0:
  2207. self.cur_el -= 1
  2208. self.draw_main(o)
  2209. o.update_display(0)
  2210. self.press_ticks_up = pygame.time.get_ticks()
  2211. since_down = 0
  2212. if o.keyState[1] == 2:
  2213. if self.press_ticks_down == None:
  2214. self.press_ticks_down = pygame.time.get_ticks()
  2215. since_down = pygame.time.get_ticks() - self.press_ticks_down
  2216. else:
  2217. self.press_ticks_down = None
  2218. self.press_ticks_down = pygame.time.get_ticks()
  2219. if o.keyState[1] == 1 or since_down > 250:
  2220. if self.cur_el < (len(self.menu) - 1):
  2221. self.cur_el += 1
  2222. self.draw_main(o)
  2223. o.update_display(0)
  2224. self.press_ticks_down = pygame.time.get_ticks()
  2225. if o.keyState[2] == 1:
  2226. if self.is_wav():
  2227. if self.last_preview == self.menu[self.cur_el]:
  2228. pass
  2229. else:
  2230. snd = pygame.mixer.Sound(o.load_song_dir + self.menu[self.cur_el])
  2231. pygame.mixer.Sound.play(snd)
  2232. #o.last_load_sound_id = self.cur_el
  2233. if o.keyState[3] == 1:
  2234. if self.menu[self.cur_el] == '..':
  2235. print('directory up')
  2236. o.last_load_sound_id = None
  2237. if o.load_song_dir == '/home/pi/zpc_ct/user/sounds/':
  2238. print('root dir - cant go up')
  2239. else:
  2240. o.load_song_dir = os.path.dirname(os.path.dirname(o.load_song_dir))
  2241. o.load_song_dir += '/'
  2242. print('new up dir is ', o.load_song_dir)
  2243. self.menu = []
  2244. self.menu.append("..")
  2245. self.menu += self.get_file_list(o)
  2246. self.cur_el = 0
  2247. elif os.path.isdir(o.load_song_dir + self.menu[self.cur_el]):
  2248. print('this is a directory ', o.load_song_dir + self.menu[self.cur_el])
  2249. o.load_song_dir = o.load_song_dir + self.menu[self.cur_el] + '/'
  2250. self.menu = []
  2251. self.menu.append("..")
  2252. self.menu += self.get_file_list(o)
  2253. self.cur_el = 0
  2254. else:
  2255. print('this is not a directory ', o.load_song_dir + self.menu[self.cur_el])
  2256. o.soundSlots[o.eSound].file = o.load_song_dir + self.menu[self.cur_el]
  2257. o.soundSlots[o.eSound].volume = 16
  2258. o.soundSlots[o.eSound].pitch = 0
  2259. o.soundSlots[o.eSound].create_sound()
  2260. o.soundSlots[o.eSound].set_pitch()
  2261. o.last_load_sound_id = self.cur_el
  2262. self.FSM.ToTransition('toMain')
  2263. def get_file_list(self, o):
  2264. dirs = os.listdir(o.load_song_dir)
  2265. dirs.sort()
  2266. return dirs
  2267. def draw_main(self, o):
  2268. al = []
  2269. ypos = 30
  2270. #print(self.menu)
  2271. if self.cur_el == 0:
  2272. _iter = 0
  2273. while len(al) < 4:
  2274. if _iter < len(self.menu):
  2275. #print('appending to al', _iter, ' ', len(self.menu))
  2276. al.append(self.menu[_iter])
  2277. else:
  2278. break
  2279. _iter += 1
  2280. elif self.cur_el == 1:
  2281. al.append(self.menu[self.cur_el - 1])
  2282. al.append(self.menu[self.cur_el])
  2283. if (self.cur_el + 1) < len(self.menu):
  2284. al.append(self.menu[self.cur_el + 1])
  2285. if (self.cur_el + 2) < len(self.menu):
  2286. al.append(self.menu[self.cur_el + 2])
  2287. elif self.cur_el == (len(self.menu) - 2):
  2288. al.append(self.menu[self.cur_el - 2])
  2289. al.append(self.menu[self.cur_el - 1])
  2290. al.append(self.menu[self.cur_el])
  2291. al.append(self.menu[self.cur_el + 1])
  2292. elif self.cur_el == (len(self.menu) - 1):
  2293. al.append(self.menu[self.cur_el - 3])
  2294. al.append(self.menu[self.cur_el - 2])
  2295. al.append(self.menu[self.cur_el - 1])
  2296. al.append(self.menu[self.cur_el])
  2297. else:
  2298. al.append(self.menu[self.cur_el - 1])
  2299. al.append(self.menu[self.cur_el])
  2300. al.append(self.menu[self.cur_el + 1])
  2301. al.append(self.menu[self.cur_el + 2])
  2302. _iter = 0
  2303. #print(al)
  2304. for i in al:
  2305. if i == self.menu[self.cur_el]:
  2306. #if _iter == self.cur_el:
  2307. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  2308. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  2309. else:
  2310. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  2311. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  2312. ypos += 20
  2313. _iter += 1
  2314. def draw_footer(self, o):
  2315. _iter = 0
  2316. width = o.width / 4
  2317. xpos = 0
  2318. yposa = 135 - 25
  2319. yposb = 135
  2320. opts = ["Up", "Down", "Play", "Open"]
  2321. while _iter < 4:
  2322. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  2323. if o.keyState[_iter] == 1:
  2324. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  2325. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  2326. else:
  2327. if _iter == 2:
  2328. if self.is_wav():
  2329. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  2330. else:
  2331. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.dark_grey)
  2332. else:
  2333. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  2334. xpos += width
  2335. _iter += 1
  2336. def is_wav(self):
  2337. if len(self.menu[self.cur_el]) > 3 and (self.menu[self.cur_el][-1] == 'V' or self.menu[self.cur_el][-1] == 'v') and (self.menu[self.cur_el][-2] == 'A' or self.menu[self.cur_el][-2] == 'a'):
  2338. return True
  2339. else:
  2340. return False
  2341. def ReceiveMessage(self, message):
  2342. o = self.FSM.owner
  2343. play_seq(o, message)
  2344. def Exit(self):
  2345. self.FSM.owner.pub.unregister("beat", self)
  2346. #====================================
  2347. class Ping(State):
  2348. def __init__(self,FSM):
  2349. super(Ping, self).__init__(FSM)
  2350. def Enter(self):
  2351. o = self.FSM.owner
  2352. o.header_text = "Ping"
  2353. o.pub.register("beat", self)
  2354. #o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  2355. #o.center_block("ping", o.h2, [0, 0, o.width,o.height], o.light_grey)
  2356. #o.update_display(0)
  2357. self.pinging = self.check_ping()
  2358. self.draw_main(o)
  2359. draw_header(o)
  2360. o.update_display(0)
  2361. super(Ping, self).Enter()
  2362. def Execute(self):
  2363. o = self.FSM.owner
  2364. menu1_actions(self, o)
  2365. if o.keyState[16] == 1:
  2366. draw_menu1(o)
  2367. o.update_display(0)
  2368. elif o.keyState[16] == 4:
  2369. draw_header(o)
  2370. #self.draw_footer(o)
  2371. self.draw_main(o)
  2372. o.update_display(0)
  2373. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  2374. draw_header(o)
  2375. #self.draw_footer(o)
  2376. self.draw_main(o)
  2377. o.update_display(0)
  2378. def draw_main(self, o):
  2379. o.center_block(self.pinging, o.h2, [0, 0, o.width, o.height], o.light_grey)
  2380. def check_ping(self):
  2381. hostname = "8.8.8.8"
  2382. response = os.system("ping -c 1 " + hostname)
  2383. # and then check the response...
  2384. if response == 0:
  2385. pingstatus = "Network Active "
  2386. else:
  2387. pingstatus = "Network Error "
  2388. return pingstatus
  2389. def ReceiveMessage(self, message):
  2390. o = self.FSM.owner
  2391. play_seq(o, message)
  2392. def Exit(self):
  2393. self.FSM.owner.pub.unregister("beat", self)
  2394. #====================================
  2395. class Wifi(State):
  2396. def __init__(self,FSM):
  2397. super(Wifi, self).__init__(FSM)
  2398. def Enter(self):
  2399. o = self.FSM.owner
  2400. o.header_text = "Wifi"
  2401. o.pub.register("beat", self)
  2402. self.ipad = self.extract_ip()
  2403. self.ssid = os.popen("sudo iwgetid -r").read()
  2404. o.center_block(self.ipad, o.h2, [0, 0, o.width,o.height], o.light_grey)
  2405. draw_header(o)
  2406. self.draw_main(o)
  2407. o.update_display(0)
  2408. super(Wifi, self).Enter()
  2409. def Execute(self):
  2410. o = self.FSM.owner
  2411. menu1_actions(self, o)
  2412. if o.keyState[16] == 1:
  2413. draw_menu1(o)
  2414. o.update_display(0)
  2415. elif o.keyState[16] == 4:
  2416. draw_header(o)
  2417. #self.draw_footer(o)
  2418. self.draw_main(o)
  2419. o.update_display(0)
  2420. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  2421. draw_header(o)
  2422. #self.draw_footer(o)
  2423. self.draw_main(o)
  2424. o.update_display(0)
  2425. def draw_main(self, o):
  2426. o.center_block(self.ipad, o.h2, [0, 0, o.width, o.height], o.light_grey)
  2427. o.center_block(self.ssid, o.h2, [0, 40, o.width, o.height+40], o.light_grey)
  2428. def extract_ip(self):
  2429. st = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  2430. try:
  2431. #st.connect(('10.255.255.255', 1))
  2432. st.connect(("8.8.8.8", 80))
  2433. IP = st.getsockname()[0]
  2434. except Exception:
  2435. IP = '127.0.0.1'
  2436. finally:
  2437. st.close()
  2438. return IP
  2439. #print(extract_ip())
  2440. def ReceiveMessage(self, message):
  2441. o = self.FSM.owner
  2442. play_seq(o, message)
  2443. def Exit(self):
  2444. self.FSM.owner.pub.unregister("beat", self)
  2445. #====================================
  2446. class Defender(State):
  2447. def __init__(self,FSM):
  2448. super(Defender, self).__init__(FSM)
  2449. def Enter(self):
  2450. o = self.FSM.owner
  2451. self.gameFSM = FSM.DefenderFSM(o)
  2452. super(Defender, self).Enter()
  2453. def Execute(self):
  2454. o = self.FSM.owner
  2455. menu1_actions(self, o)
  2456. if o.keyState[16] == 1:
  2457. draw_menu1(o)
  2458. o.update_display(0)
  2459. elif o.keyState[16] == 4:
  2460. #draw_header(o)
  2461. #self.draw_footer(o)
  2462. #self.draw_main(o)
  2463. #o.update_display(0)
  2464. pass
  2465. if o.keyState[16] > 0 or o.keyState[17] > 0:
  2466. #if o.keyState[16] > 0:
  2467. pass
  2468. else:
  2469. self.gameFSM.Execute()
  2470. def Exit(self):
  2471. pass
  2472. #====================================
  2473. #====================================
  2474. class Update(State):
  2475. def __init__(self,FSM):
  2476. super(Update, self).__init__(FSM)
  2477. def Enter(self):
  2478. o = self.FSM.owner
  2479. o.header_text = "Update"
  2480. o.pub.register("beat", self)
  2481. g = git.cmd.Git("/home/pi/zpc_ct/")
  2482. self.msg = g.pull()
  2483. if o.keyState[16] > 0 or o.keyState[17] > 0:
  2484. pass
  2485. else:
  2486. draw_header(o)
  2487. o.update_display(0)
  2488. super(Update, self).Enter()
  2489. def Execute(self):
  2490. o = self.FSM.owner
  2491. menu1_actions(self, o)
  2492. if o.keyState[16] == 1:
  2493. draw_menu1(o)
  2494. o.update_display(0)
  2495. elif o.keyState[16] == 4:
  2496. draw_header(o)
  2497. #self.draw_footer(o)
  2498. self.draw_main(o)
  2499. o.update_display(0)
  2500. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  2501. draw_header(o)
  2502. #self.draw_footer(o)
  2503. self.draw_main(o)
  2504. o.update_display(0)
  2505. if o.keyState[16] > 0 or o.keyState[17] > 0:
  2506. pass
  2507. else:
  2508. pass
  2509. #o.update_display(0)
  2510. def draw_main(self, o):
  2511. #o.center_text(self.msg, o.h1, o.width, 25, o.light_grey)
  2512. o.center_block(self.msg, o.h2, [0, 0, o.width, o.height], o.light_grey)
  2513. def ReceiveMessage(self, message):
  2514. o = self.FSM.owner
  2515. play_seq(o, message)
  2516. def Exit(self):
  2517. self.FSM.owner.pub.unregister("beat", self)
  2518. #====================================
  2519. class Calculator(State):
  2520. def __init__(self,FSM):
  2521. super(Calculator, self).__init__(FSM)
  2522. def Enter(self):
  2523. o = self.FSM.owner
  2524. o.pub.register("beat", self)
  2525. self.num1 = ''
  2526. self.num2 = ''
  2527. self.op = ''
  2528. self.result = ''
  2529. self.labels = ['.', '0', '=', '/',
  2530. '1', '2', '3', '*',
  2531. '4', '5', '6', '-',
  2532. '7', '8', '9', '+',
  2533. '7', '8', '9', '+']
  2534. self.draw_main(o)
  2535. o.update_display(0)
  2536. print('hi calc')
  2537. super(Calculator, self).Enter()
  2538. def Execute(self):
  2539. o = self.FSM.owner
  2540. menu1_actions(self, o)
  2541. if o.keyState[16] == 1:
  2542. draw_menu1(o)
  2543. o.update_display(0)
  2544. elif o.keyState[16] == 4:
  2545. self.draw_main(o)
  2546. o.update_display(0)
  2547. if o.keyState[16] > 0:
  2548. pass
  2549. else:
  2550. #pass
  2551. if o.keyState[17] == 1:
  2552. self.num1 = ''
  2553. self.num2 = ''
  2554. self.op = ''
  2555. self.result = ''
  2556. self.check_keys(o)
  2557. def append_num(self, num):
  2558. ops = ['+', '-', '*', '/']
  2559. print('appending num ', num)
  2560. if num in ops:
  2561. if self.num1 != '':
  2562. self.op = num
  2563. elif num == '=':
  2564. print('this is that')
  2565. if self.num2 != '':
  2566. if self.op == '+':
  2567. self.result = float(self.num1) + float(self.num2)
  2568. print(self.result)
  2569. if self.op == '-':
  2570. self.result = float(self.num1) - float(self.num2)
  2571. print(self.result)
  2572. if self.op == '*':
  2573. self.result = float(self.num1) * float(self.num2)
  2574. print(self.result)
  2575. if self.op == '/':
  2576. self.result = float(self.num1) / float(self.num2)
  2577. print(self.result)
  2578. else:
  2579. if self.result != '':
  2580. self.num1 = ''
  2581. self.num2 = ''
  2582. self.op = ''
  2583. self.result = ''
  2584. if self.op == '':
  2585. self.num1 += num
  2586. print('---append ', num)
  2587. else:
  2588. self.num2 += num
  2589. print('---append ', num)
  2590. def check_keys(self, o):
  2591. _iter = 0
  2592. for k in o.keyState:
  2593. if k == 1:
  2594. if _iter == 0:
  2595. if ('.' not in self.num1 and self.num2 == '') or (self.num2 != '' and '.' not in self.num2):
  2596. self.append_num('.')
  2597. if _iter == 1:
  2598. self.append_num('0')
  2599. if _iter == 2:
  2600. self.append_num('=')
  2601. if _iter == 3:
  2602. self.append_num('/')
  2603. if _iter == 4:
  2604. self.append_num('1')
  2605. if _iter == 5:
  2606. self.append_num('2')
  2607. if _iter == 6:
  2608. self.append_num('3')
  2609. if _iter == 7:
  2610. self.append_num('*')
  2611. if _iter == 8:
  2612. self.append_num('4')
  2613. if _iter == 9:
  2614. self.append_num('5')
  2615. if _iter == 10:
  2616. self.append_num('6')
  2617. if _iter == 11:
  2618. self.append_num('-')
  2619. if _iter == 12:
  2620. self.append_num('7')
  2621. if _iter == 13:
  2622. self.append_num('8')
  2623. if _iter == 14:
  2624. self.append_num('9')
  2625. if _iter == 15:
  2626. self.append_num('+')
  2627. self.draw_main(o)
  2628. _iter += 1
  2629. def draw_main(self, o):
  2630. print('drawing ', self.num1)
  2631. x_size = o.width / 4
  2632. y_size = o.height / 5
  2633. og_x = 0
  2634. o_x = og_x
  2635. o_y = o.height
  2636. text_padding = 6
  2637. _id = 0
  2638. while _id < 20:
  2639. # lab = ""
  2640. # for i in self.labels[_id]:
  2641. # lab += i
  2642. lab = self.labels[_id]
  2643. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.blue)
  2644. o.center_block(lab, o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  2645. o_x = o_x + x_size
  2646. _id += 1
  2647. if _id % 4 == 0:
  2648. o_y -= y_size
  2649. o_x = og_x
  2650. o.draw.rectangle((0, 0, o.width, y_size), outline=0, fill=o.blue)
  2651. #o.center_block('where is my fucking text', o.h2, [0, 0, o.width, y_size], o.light_grey)
  2652. if self.num1 != '':
  2653. if self.result != '':
  2654. o.center_block(str(self.result), o.h2, [0, 0, o.width, y_size], o.light_grey)
  2655. elif self.num2 != '':
  2656. o.center_block(str(self.num2), o.h2, [0, 0, o.width, y_size], o.light_grey)
  2657. elif self.op != '':
  2658. o.center_block(str(self.op), o.h2, [0, 0, o.width, y_size], o.light_grey)
  2659. else:
  2660. o.center_block(str(self.num1), o.h2, [0, 0, o.width, y_size], o.light_grey)
  2661. print('fucking do something')
  2662. else:
  2663. print('num1 is empty')
  2664. o.update_display(0)
  2665. def ReceiveMessage(self, message):
  2666. o = self.FSM.owner
  2667. play_seq(o, message)
  2668. def Exit(self):
  2669. self.FSM.owner.pub.unregister("beat", self)
  2670. #====================================