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 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. print('appending num ', num)
  55. if num in ops:
  56. if self.num1 != '':
  57. self.op = num
  58. self.num2 = ''
  59. self.result = ''
  60. elif num == '=':
  61. print('this is that')
  62. if self.num2 != '':
  63. if self.result == '':
  64. if self.op == '+':
  65. self.result = float(self.num1) + float(self.num2)
  66. print(self.result)
  67. if self.op == '-':
  68. self.result = float(self.num1) - float(self.num2)
  69. print(self.result)
  70. if self.op == '*':
  71. self.result = float(self.num1) * float(self.num2)
  72. print(self.result)
  73. if self.op == '/':
  74. self.result = float(self.num1) / float(self.num2)
  75. print(self.result)
  76. else:
  77. if self.op != '':
  78. if self.op == '+':
  79. self.result = self.result + float(self.num2)
  80. print(self.result)
  81. if self.op == '-':
  82. self.result = self.result - float(self.num2)
  83. print(self.result)
  84. if self.op == '*':
  85. self.result = self.result * float(self.num2)
  86. print(self.result)
  87. if self.op == '/':
  88. self.result = self.result / float(self.num2)
  89. print(self.result)
  90. else:
  91. if self.result != '':
  92. self.num1 = ''
  93. self.num2 = ''
  94. self.op = ''
  95. self.result = ''
  96. if self.op == '':
  97. self.num1 += num
  98. print('---append ', num)
  99. else:
  100. self.num2 += num
  101. print('---append ', num)
  102. def check_keys(self, o):
  103. _iter = 0
  104. for k in o.keyState:
  105. if k == 1:
  106. if _iter == 0:
  107. if ('.' not in self.num1 and self.num2 == '') or (self.num2 != '' and '.' not in self.num2):
  108. self.append_num('.')
  109. if _iter == 1:
  110. self.append_num('0')
  111. if _iter == 2:
  112. self.append_num('=')
  113. if _iter == 3:
  114. self.append_num('/')
  115. if _iter == 4:
  116. self.append_num('1')
  117. if _iter == 5:
  118. self.append_num('2')
  119. if _iter == 6:
  120. self.append_num('3')
  121. if _iter == 7:
  122. self.append_num('*')
  123. if _iter == 8:
  124. self.append_num('4')
  125. if _iter == 9:
  126. self.append_num('5')
  127. if _iter == 10:
  128. self.append_num('6')
  129. if _iter == 11:
  130. self.append_num('-')
  131. if _iter == 12:
  132. self.append_num('7')
  133. if _iter == 13:
  134. self.append_num('8')
  135. if _iter == 14:
  136. self.append_num('9')
  137. if _iter == 15:
  138. self.append_num('+')
  139. self.draw_main(o)
  140. _iter += 1
  141. def draw_main(self, o):
  142. print('drawing ', self.num1)
  143. x_size = o.width / 4
  144. y_size = o.height / 5
  145. og_x = 0
  146. o_x = og_x
  147. o_y = o.height
  148. text_padding = 6
  149. _id = 0
  150. while _id < 20:
  151. # lab = ""
  152. # for i in self.labels[_id]:
  153. # lab += i
  154. lab = self.labels[_id]
  155. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.blue)
  156. o.center_block(lab, o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  157. o_x = o_x + x_size
  158. _id += 1
  159. if _id % 4 == 0:
  160. o_y -= y_size
  161. o_x = og_x
  162. #o.draw.rectangle((0, 0, o.width, y_size), outline=0, fill=o.blue)
  163. o.draw.rectangle((0, 0, x_size * 3, y_size), outline=0, fill=o.blue)
  164. o.draw.rectangle((x_size * 3, 0, o.width, y_size), outline=0, fill=o.blue)
  165. o.center_block("Clear", o.h2, [x_size * 3, 0, o.width, y_size], o.light_grey)
  166. #o.center_block('where is my fucking text', o.h2, [0, 0, o.width, y_size], o.light_grey)
  167. if self.num1 != '':
  168. if self.result != '':
  169. o.center_block(str(self.result), o.h2, [0, 0, x_size * 3, y_size], o.light_grey)
  170. elif self.num2 != '':
  171. o.center_block(str(self.num2), o.h2, [0, 0, x_size * 3, y_size], o.light_grey)
  172. elif self.op != '':
  173. o.center_block(str(self.op), o.h2, [0, 0, x_size * 3, y_size], o.light_grey)
  174. else:
  175. o.center_block(str(self.num1), o.h2, [0, 0, x_size * 3, y_size], o.light_grey)
  176. print('fucking do something')
  177. else:
  178. print('num1 is empty')
  179. o.update_display(0)
  180. def ReceiveMessage(self, message):
  181. o = self.FSM.owner
  182. u.play_seq(o, message)
  183. def Exit(self):
  184. self.FSM.owner.pub.unregister("beat", self)