Guest User

Untitled

a guest
Jun 13th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.83 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import os
  4. import platform
  5. import serial
  6. import ble_communication as ble
  7. import math
  8. import time
  9. import datetime
  10. import gi
  11. gi.require_version('Gtk', '3.0')
  12. from gi.repository import Gtk
  13. from gi.repository import GObject
  14.  
  15. continuousModeFlag = 0
  16.  
  17. class TempyUI:
  18.  
  19. def __init__(self):
  20. self.gladefile = "tempy.glade"
  21. self.builder = Gtk.Builder()
  22. self.builder.add_from_file(self.gladefile)
  23. self.builder.connect_signals(self)
  24. self.selected_port = ""
  25. self.connected = False
  26. self.progress = 0.0
  27. self.counter = 300000
  28. self.current_mode = 0
  29.  
  30. self.window = self.builder.get_object("window1")
  31. self.window.show()
  32.  
  33. self.port_selection = self.builder.get_object("port_select")
  34. self.connect_btn = self.builder.get_object("connect_button")
  35. self.single_mode_btn = self.builder.get_object("single_mode_btn")
  36. self.continuous_mode_btn = self.builder.get_object("continuous_mode_btn")
  37. self.connection_status = self.builder.get_object("connection_status")
  38. self.mac_address = self.builder.get_object("mac_address")
  39. self.temperature_1 = self.builder.get_object("temperature_1")
  40. self.temperature_2 = self.builder.get_object("temperature_2")
  41. self.battery_level = self.builder.get_object("battery_level")
  42. self.operation_mode = self.builder.get_object("op_mode")
  43. self.calibration_data = self.builder.get_object("calib_data")
  44. self.port_list = self.builder.get_object("port_selection")
  45. self.read_temperature_btn = self.builder.get_object("read_temperature_btn")
  46. self.read_calibration_btn = self.builder.get_object("read_calibration_btn")
  47. self.read_opmode_btn = self.builder.get_object("read_opmode_btn")
  48. self.progress_bar = self.builder.get_object("progressbar")
  49. self.status_bar = self.builder.get_object("statusbar")
  50. self.label_modo = self.builder.get_object("label_modo")
  51. self.list_serial_ports()
  52. self.disable_all_buttons()
  53. self.status_bar.push(0, "Disconnected")
  54.  
  55. self.ble_manager = ble.BLEManager(self.ble_callback)
  56.  
  57. def check_ble_activity(self):
  58. GObject.timeout_add(10, self.check_ble_activity)
  59. self.ble_manager.check_activity()
  60.  
  61. def on_window1_destroy(self, object, data=None):
  62. if self.ble_manager.is_connected():
  63. self.ble_manager.disconnect()
  64. Gtk.main_quit()
  65.  
  66. def on_connect_button_toggled(self, data=None):
  67. if self.connect_btn.get_active():
  68. self.connect_btn.set_label("Disconnect")
  69. self.status_bar.push(0, "Open serial port...")
  70. self.connect_serial_port(self.selected_port)
  71. self.status_bar.push(0, "Serial port ok!")
  72. self.status_bar.push(0, "Scanning ble devices...")
  73. self.ble_manager.scan_and_connect()
  74. GObject.timeout_add(10, self.check_ble_activity)
  75. else:
  76. if self.ble_manager.is_connected():
  77. self.ble_manager.set_operation_mode([0])
  78. self.ble_manager.disconnect()
  79. self.single_mode_btn.set_active(True)
  80. self.connect_btn.set_label("Connect")
  81. self.status_bar.push(0, "Disconnected")
  82. self.clear_values()
  83. self.disable_all_buttons()
  84.  
  85. def on_port_select_changed(self, widget, data=None):
  86. index = widget.get_active()
  87. model = widget.get_model()
  88. item = model[index][1]
  89. self.selected_port = item
  90.  
  91. def on_single_mode_btn_toggled(self, data=None):
  92. global continuousModeFlag
  93. if self.single_mode_btn.get_active():
  94. self.ble_manager.set_operation_mode([0])
  95. continuousModeFlag = 0
  96.  
  97. def on_continuous_mode_btn_toggled(self, data=None):
  98. global continuousModeFlag
  99. if self.continuous_mode_btn.get_active():
  100. self.ble_manager.set_operation_mode([1])
  101. self.get_periodic_measurements()
  102. continuousModeFlag = 1
  103.  
  104. def on_read_temperature_btn_clicked(self, data=None):
  105. self.ble_manager.request_tempy_data()
  106.  
  107. def on_read_calibration_btn_clicked(self, data=None):
  108. self.ble_manager.request_calibration_data()
  109.  
  110. def on_read_opmode_btn_clicked(self, data=None):
  111. self.ble_manager.request_operation_mode()
  112.  
  113. def disable_all_buttons(self):
  114. self.read_temperature_btn.set_sensitive(False)
  115. self.read_calibration_btn.set_sensitive(False)
  116. self.read_opmode_btn.set_sensitive(False)
  117. self.single_mode_btn.set_sensitive(False)
  118. self.continuous_mode_btn.set_sensitive(False)
  119.  
  120.  
  121. def enable_all_buttons(self):
  122. self.read_temperature_btn.set_sensitive(True)
  123. self.read_calibration_btn.set_sensitive(True)
  124. self.read_opmode_btn.set_sensitive(True)
  125. self.single_mode_btn.set_sensitive(True)
  126. self.continuous_mode_btn.set_sensitive(True)
  127.  
  128. def list_serial_ports(self):
  129. self.port_list = Gtk.ListStore(int, str)
  130. if os.name == 'nt': # windows
  131. ports = ['COM%s' % (i + 1) for i in range(256)]
  132. result = []
  133. index = 0
  134.  
  135. for port in ports:
  136. try:
  137. s = serial.Serial(port)
  138. s.close()
  139. result.append(port)
  140. self.port_list.append([index, result[index]])
  141. index += 1
  142. except (OSError, serial.SerialException):
  143. pass
  144. elif platform.system() == "Darwin": # MAC
  145. self.port_list.append([0, "/dev/tty.usbmodem1"])
  146.  
  147. else: # Linux
  148. self.port_list.append([0, "/dev/ttyACM0"])
  149.  
  150. self.port_selection.set_model(self.port_list)
  151. cell = Gtk.CellRendererText()
  152. self.port_selection.pack_start(cell, True)
  153. self.port_selection.add_attribute(cell, 'text', 1)
  154. self.port_selection.set_active(0)
  155.  
  156. def ble_callback(self, event, data):
  157. global continuousModeFlag
  158.  
  159. if event == ble.EVENT_SCAN_RESPONSE:
  160. self.status_bar.push(0, "Found BLE device")
  161. elif event == ble.EVENT_CONNECTION_STATUS:
  162. self.enable_all_buttons()
  163. self.status_bar.push(0, "Connected to %s" % ':'.join(['%02X' % b for b in data[::-1]]))
  164. self.mac_address.set_text("%s" % ':'.join(['%02X' % b for b in data[::-1]]))
  165.  
  166. file = open("temperatures.txt", "w")
  167. file.write("Temperature 1: ")
  168. file.write("Temperature 2: ")
  169. file.write("Horario: ")
  170. file.write("\n")
  171. file.close()
  172.  
  173. elif event == ble.EVENT_GROUP_FOUND:
  174. self.status_bar.push(0, "Group found")
  175. elif event == ble.EVENT_CHARACTERISTIC_FOUND:
  176. self.status_bar.push(0, "Characteristic found %s" % data)
  177. elif event == ble.EVENT_SERVICE_FOUND:
  178. self.status_bar.push(0, "Service found %s" % data)
  179. elif event == ble.EVENT_TEMPY_DATA:
  180.  
  181.  
  182. temperature_1 = data[0] | (data[1] << 8)
  183. if temperature_1 == 0:
  184. temperature_1 = 1
  185.  
  186. temperature_2 = data[2] | (data[3] << 8)
  187. if temperature_2 == 0:
  188. temperature_1 = 1
  189.  
  190. print (data)
  191. print (data[6] | (data[7] << 8))
  192.  
  193. if ( data[6] | (data[7] << 8) == 0):
  194. self.label_modo.set_text("Normal")
  195. if ( data[6] | (data[7] << 8) == 1):
  196. self.label_modo.set_text("Prediction Mode")
  197. if ( data[6] | (data[7] << 8) == 2):
  198. self.label_modo.set_text("Chute Mode")
  199. print (temperature_1)
  200. print (temperature_2)
  201.  
  202. now = datetime.datetime.now()
  203. datetime.time(now.hour, now.minute, now.second)
  204.  
  205. if continuousModeFlag == 1:
  206. file = open("temperxpgreatures.txt", "a")
  207. file.write(str("%.1f" % self.calculate_temperature(temperature_1)))
  208. file.write(" ")
  209. file.write(str("%.1f" % self.calculate_temperature(temperature_2)))
  210. file.write(" ")
  211. file.write(str(datetime.time(now.hour, now.minute, now.second)))
  212. file.write("\n")
  213. file.close()
  214.  
  215. battery = data[4] | (data[5] << 8)
  216. self.temperature_1.set_text("%.1f" % self.calculate_temperature(temperature_1))
  217. self.temperature_2.set_text("%.1f" % self.calculate_temperature(temperature_2))
  218. self.battery_level.set_text("%d%%" % battery)
  219. self.ble_manager.request_ack()
  220.  
  221. elif event == ble.EVENT_CALIBRATION_DATA:
  222. self.status_bar.push(0, "Tempy calibration received")
  223. self.calibration_data.set_text("%s" % data)
  224.  
  225. elif event == ble.EVENT_OPMODE_DATA:
  226. self.status_bar.push(0, "Tempy operation mode received")
  227. if data[0] == 0:
  228. self.operation_mode.set_text("Single mode")
  229. self.single_mode_btn.set_active(True)
  230. elif data[0]==1:
  231. self.operation_mode.set_text("Cont. mode")
  232. self.continuous_mode_btn.set_active(True)
  233. self.get_periodic_measurements()
  234. self.current_mode = data[0]
  235.  
  236. elif event == ble.EVENT_LOST_CONNECTION:
  237. if self.ble_manager.operation_mode == [1]: # continuous mode
  238. self.try_to_reconnect()
  239. else:
  240. self.connect_btn.set_active(False)
  241. elif event == ble.EVENT_TIMED_OUT:
  242. self.status_bar.push(0, "connection timed out")
  243.  
  244. def connect_serial_port(self, port_selected):
  245. try:
  246. ser = serial.Serial(port=port_selected, baudrate=115200, timeout=1, writeTimeout=1)
  247. except serial.SerialException as e:
  248. self.status_bar.push(0, "Serial port error")
  249. return
  250.  
  251. ser.flushInput()
  252. ser.flushOutput()
  253. self.ble_manager.initialize(ser)
  254.  
  255. def try_to_reconnect(self):
  256. if not self.ble_manager.is_connected():
  257. self.status_bar.push(0, "Trying to reconnect...")
  258. GObject.timeout_add(1000, self.try_to_reconnect)
  259. self.ble_manager.reconnect()
  260.  
  261. def get_periodic_measurements(self):
  262. if self.ble_manager.is_connected():
  263. if self.ble_manager.operation_mode == [1]: # continuous mode
  264. if self.counter < float(30):
  265. self.counter += 1
  266. self.progress += 1/(float(30))
  267. else:
  268. self.counter = 0
  269. self.progress = 0.0
  270. self.progress_bar.set_fraction(self.progress)
  271. GObject.timeout_add(1000, self.get_periodic_measurements)
  272.  
  273. def calculate_temperature(self, adc_value):
  274. adc_reference = 1.24
  275. adc_resolution = 2048
  276. r_25c = 10000.0
  277. beta = 3950.0
  278. circuit_reference = 2.048
  279.  
  280. adc_voltage = (adc_reference / adc_resolution) * adc_value
  281. rth = (adc_voltage * 10000) / (circuit_reference - adc_voltage)
  282. rinf = r_25c * math.exp((-beta / (25 + 273.15)))
  283. temperature = (beta / math.log(abs((rth / rinf)))) - 273.15
  284. return temperature
  285.  
  286. def clear_values(self):
  287. self.operation_mode.set_text("- - -")
  288. self.temperature_1.set_text("- - -")
  289. self.temperature_2.set_text("- - -")
  290. self.battery_level.set_text("- - -")
  291. self.calibration_data.set_text("- - -")
  292. self.mac_address.set_text("- - : - - : - - : - - : - - : - - ")
  293.  
  294. if __name__ == "__main__":
  295. mainUI = TempyUI()
  296. Gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment