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.

sCalculator.py 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. import FSM
  2. import utils as u
  3. import menus as m
  4. #====================================
  5. State = type("State", (object,), {})
  6. #====================================
  7. class State(object):
  8. def __init__(self, FSM):
  9. self.FSM = FSM
  10. def Enter(self):
  11. pass
  12. def Execute(self):
  13. pass
  14. def Exit(self):
  15. pass
  16. class Calculator(State):
  17. def __init__(self,FSM):
  18. super(Calculator, self).__init__(FSM)
  19. def Enter(self):
  20. o = self.FSM.owner
  21. o.pub.register("beat", self)
  22. self.num1 = ''
  23. self.num2 = ''
  24. self.op = ''
  25. self.result = ''
  26. self.labels = ['.', '0', '=', '/',
  27. '1', '2', '3', '*',
  28. '4', '5', '6', '-',
  29. '7', '8', '9', '+',
  30. '7', '8', '9', '+']
  31. self.draw_main(o)
  32. o.update_display(0)
  33. super(Calculator, self).Enter()
  34. def Execute(self):
  35. o = self.FSM.owner
  36. m.menu1_actions(self, o)
  37. if o.keyState[16] == 1:
  38. m.draw_menu1(o)
  39. o.update_display(0)
  40. elif o.keyState[16] == 4:
  41. self.draw_main(o)
  42. o.update_display(0)
  43. if o.keyState[16] > 0:
  44. pass
  45. else:
  46. if o.keyState[17] == 1:
  47. self.num1 = ''
  48. self.num2 = ''
  49. self.op = ''
  50. self.result = ''
  51. self.check_keys(o)
  52. def append_num(self, num):
  53. ops = ['+', '-', '*', '/']
  54. if num in ops:
  55. if self.num1 != '':
  56. self.op = num
  57. self.num2 = ''
  58. self.result = ''
  59. elif num == '=':
  60. if self.num2 != '':
  61. if self.result == '':
  62. if self.op == '+':
  63. self.result = float(self.num1) + float(self.num2)
  64. print(self.result)
  65. if self.op == '-':
  66. self.result = float(self.num1) - float(self.num2)
  67. print(self.result)
  68. if self.op == '*':
  69. self.result = float(self.num1) * float(self.num2)
  70. print(self.result)
  71. if self.op == '/':
  72. self.result = float(self.num1) / float(self.num2)
  73. print(self.result)
  74. else:
  75. if self.op != '':
  76. if self.op == '+':
  77. self.result = self.result + float(self.num2)
  78. print(self.result)
  79. if self.op == '-':
  80. self.result = self.result - float(self.num2)
  81. print(self.result)
  82. if self.op == '*':
  83. self.result = self.result * float(self.num2)
  84. print(self.result)
  85. if self.op == '/':
  86. self.result = self.result / float(self.num2)
  87. print(self.result)
  88. else:
  89. if self.result != '':
  90. self.num1 = ''
  91. self.num2 = ''
  92. self.op = ''
  93. self.result = ''
  94. if self.op == '':
  95. self.num1 += num
  96. else:
  97. self.num2 += num
  98. def check_keys(self, o):
  99. _iter = 0
  100. for k in o.keyState:
  101. if k == 1:
  102. if _iter == 0:
  103. if ('.' not in self.num1 and self.num2 == '') or (self.num2 != '' and '.' not in self.num2):
  104. self.append_num('.')
  105. if _iter == 1:
  106. self.append_num('0')
  107. if _iter == 2:
  108. self.append_num('=')
  109. if _iter == 3:
  110. self.append_num('/')
  111. if _iter == 4:
  112. self.append_num('1')
  113. if _iter == 5:
  114. self.append_num('2')
  115. if _iter == 6:
  116. self.append_num('3')
  117. if _iter == 7:
  118. self.append_num('*')
  119. if _iter == 8:
  120. self.append_num('4')
  121. if _iter == 9:
  122. self.append_num('5')
  123. if _iter == 10:
  124. self.append_num('6')
  125. if _iter == 11:
  126. self.append_num('-')
  127. if _iter == 12:
  128. self.append_num('7')
  129. if _iter == 13:
  130. self.append_num('8')
  131. if _iter == 14:
  132. self.append_num('9')
  133. if _iter == 15:
  134. self.append_num('+')
  135. self.draw_main(o)
  136. _iter += 1
  137. def draw_main(self, o):
  138. x_size = o.width / 4
  139. y_size = o.height / 5
  140. og_x = 0
  141. o_x = og_x
  142. o_y = o.height
  143. text_padding = 6
  144. _id = 0
  145. while _id < 20:
  146. lab = self.labels[_id]
  147. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.blue)
  148. o.center_block(lab, o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  149. o_x = o_x + x_size
  150. _id += 1
  151. if _id % 4 == 0:
  152. o_y -= y_size
  153. o_x = og_x
  154. o.draw.rectangle((0, 0, x_size * 3, y_size), outline=0, fill=o.blue)
  155. o.draw.rectangle((x_size * 3, 0, o.width, y_size), outline=0, fill=o.blue)
  156. o.center_block("Clear", o.h2, [x_size * 3, 0, o.width, y_size], o.light_grey)
  157. if self.num1 != '':
  158. if self.result != '':
  159. o.center_block(str(self.result), o.h2, [0, 0, x_size * 3, y_size], o.light_grey)
  160. elif self.num2 != '':
  161. o.center_block(str(self.num2), o.h2, [0, 0, x_size * 3, y_size], o.light_grey)
  162. elif self.op != '':
  163. o.center_block(str(self.op), o.h2, [0, 0, x_size * 3, y_size], o.light_grey)
  164. else:
  165. o.center_block(str(self.num1), o.h2, [0, 0, x_size * 3, y_size], o.light_grey)
  166. else:
  167. pass
  168. o.update_display(0)
  169. def ReceiveMessage(self, message):
  170. o = self.FSM.owner
  171. u.play_seq(o, message)
  172. def Exit(self):
  173. self.FSM.owner.pub.unregister("beat", self)