From bc74c423fe55f6ede51ad3dc1cbea139e923b59d Mon Sep 17 00:00:00 2001 From: Andrew Alberding Date: Tue, 3 Dec 2019 20:24:13 -0500 Subject: [PATCH 1/4] Added display and full files --- Adafruit_CircuitPython_SSD1306 | 1 + BACKRG__.TTF | Bin 0 -> 18924 bytes PRSANSR.TTF | Bin 0 -> 25980 bytes b.ttf | Bin 0 -> 18924 bytes display.py | 39 +++++++++++++++++++++++++++++++++ font5x8.bin | Bin 0 -> 1282 bytes obdmac | 1 + output.txt | 0 test.py | 26 ++++++++++++++++++++++ 9 files changed, 67 insertions(+) create mode 160000 Adafruit_CircuitPython_SSD1306 create mode 100644 BACKRG__.TTF create mode 100644 PRSANSR.TTF create mode 100644 b.ttf create mode 100644 display.py create mode 100644 font5x8.bin create mode 100644 obdmac create mode 100644 output.txt create mode 100644 test.py diff --git a/Adafruit_CircuitPython_SSD1306 b/Adafruit_CircuitPython_SSD1306 new file mode 160000 index 00000000..3e6b7f13 --- /dev/null +++ b/Adafruit_CircuitPython_SSD1306 @@ -0,0 +1 @@ +Subproject commit 3e6b7f13a406cc210718ff19704319c783e96740 diff --git a/BACKRG__.TTF b/BACKRG__.TTF new file mode 100644 index 0000000000000000000000000000000000000000..c4293e2d831a349a7a08185df1ade99a2b886c73 GIT binary patch literal 18924 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 Ry$Ad0{QPuw-f&h3`9CX3DdPYD literal 0 HcmV?d00001 diff --git a/b.ttf b/b.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c4293e2d831a349a7a08185df1ade99a2b886c73 GIT binary patch literal 18924 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 literal 0 HcmV?d00001 diff --git a/obdmac b/obdmac new file mode 100644 index 00000000..a35b2910 --- /dev/null +++ b/obdmac @@ -0,0 +1 @@ +00:1D:A5:03:1E:12 diff --git a/output.txt b/output.txt new file mode 100644 index 00000000..e69de29b diff --git a/test.py b/test.py new file mode 100644 index 00000000..234ca997 --- /dev/null +++ b/test.py @@ -0,0 +1,26 @@ +import obd +import sys +import os +import time +#obd.logger.setLevel(obd.logging.DEBUG) + +ports = obd.scan_serial() +print ports +connection = obd.OBD(fast=False, timeout=30) #, check_voltage=False) # auto-connects to USB or RF port + +cmd = obd.commands.SPEED # select an OBD command (sensor) + +response = connection.query(cmd) # send the command, and parse the response + +#print(response.value) # returns unit-bearing values thanks to Pint +#print(response.value.to("mph")) # user-friendly unit conversions +f = open("output.txt","w+") +while(True): + time.sleep(0.8) + rpm = connection.query(obd.commands.RPM).value.magnitude + print(rpm) + rpms= str(rpm) + output = 'python3 display.py' + output = output + ' ' + rpms + os.system(output) + From e941964959f3d9bdb52c15ff0f46b4d3cf24403f Mon Sep 17 00:00:00 2001 From: Andrew Alberding Date: Wed, 4 Dec 2019 20:01:21 -0500 Subject: [PATCH 2/4] Added display repo, updated test.py --- display.py | 20 +++++++++----------- test.py | 8 ++++++-- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/display.py b/display.py index a52f8fae..bf18fba4 100644 --- a/display.py +++ b/display.py @@ -17,22 +17,20 @@ # Load a font in 2 different sizes. font = ImageFont.truetype('/home/pi/python-OBD/b.ttf', 28) - - - -#display.text('olleh123',0,34,0xFFFFF, font_name=font, size=2) -#display.show() - -#display.fill(0) -#display.show() - - +image = Image.new('1', (display.width, display.height)) +draw = ImageDraw.Draw(image) +draw.text((0, 30), '!olleH', font=font, fill=255) +display.image(image) +display.show() x = sys.argv[1] # Draw the text # draw.text((34, 0), 'Hello!', font=font, fill=255) #draw.text("Hello",34,0,color=0xFF0000,font_name=font) -display.text(x,0,34,0xFFFFF, font_name=font, size=2) + +#display.text(x,0,34,0xFFFFF, font_name=font, size=2) + + # Display image display.show() diff --git a/test.py b/test.py index 234ca997..e59378b7 100644 --- a/test.py +++ b/test.py @@ -14,13 +14,17 @@ #print(response.value) # returns unit-bearing values thanks to Pint #print(response.value.to("mph")) # user-friendly unit conversions -f = open("output.txt","w+") +def reverse(s): + str = "" + for i in s: + str = i + str + return str while(True): time.sleep(0.8) rpm = connection.query(obd.commands.RPM).value.magnitude print(rpm) rpms= str(rpm) + rpms = reverse(rpms) output = 'python3 display.py' output = output + ' ' + rpms os.system(output) - From f1c51523c63491138204b87d472219885e552b4f Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 23 Apr 2020 13:58:21 -0400 Subject: [PATCH 3/4] Modified test.py for GUI/IPC features --- test.py | 65 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/test.py b/test.py index e59378b7..11e0e113 100644 --- a/test.py +++ b/test.py @@ -3,28 +3,59 @@ import os import time #obd.logger.setLevel(obd.logging.DEBUG) +from multiprocessing.connection import Listener + +address = ('127.0.0.1', 6000) # family is deduced to be 'AF_INET' +listener = Listener(address) +conn = listener.accept() +print("listener accepted") + +from threading import * ports = obd.scan_serial() -print ports -connection = obd.OBD(fast=False, timeout=30) #, check_voltage=False) # auto-connects to USB or RF port +print (ports) +connection = obd.OBD(fast=True, timeout=30, check_voltage=False) # auto-connects to USB or RF port cmd = obd.commands.SPEED # select an OBD command (sensor) -response = connection.query(cmd) # send the command, and parse the response +#response = connection.query(cmd) # send the command, and parse the response #print(response.value) # returns unit-bearing values thanks to Pint #print(response.value.to("mph")) # user-friendly unit conversions -def reverse(s): - str = "" - for i in s: - str = i + str - return str -while(True): - time.sleep(0.8) - rpm = connection.query(obd.commands.RPM).value.magnitude - print(rpm) - rpms= str(rpm) - rpms = reverse(rpms) - output = 'python3 display.py' - output = output + ' ' + rpms - os.system(output) +screen_lock = Semaphore(value=1) + +def speedandrpm(): + while(True): + time.sleep(0.8) + screen_lock.acquire() + rpm = connection.query(obd.commands.RPM).value.magnitude + print(rpm) + speed = connection.query(cmd) + screen_lock.release() + print(speed) +def voicerec(): + while(True): + msg = conn.recv() #Recieve the message from porcupine... + if msg == 'picovoice': + print("Fuel level is: " + str(connection.query(obd.commands.FUEL_LEVEL).value)) + #break + elif msg == 'porcupine': + print("Runtime is: " + str(connection.query(obd.commands.RUN_TIME).value)) + #break + #listener.close() + #rpms= str(rpm) + #rpms = reverse(rpms) + #output = 'python3 display.py' + #output = output + ' ' + rpms + #os.system(output) + + +t1 = Thread(target = speedandrpm) +t2 = Thread(target = voicerec) + +t1.start() +t2.start() + + + +listener.close() From a2ebe1ce72f5b12b9b539d3e86530f6283da4058 Mon Sep 17 00:00:00 2001 From: Andrew Alberding Date: Sun, 17 May 2020 17:58:10 -0400 Subject: [PATCH 4/4] Final Interprocess Commit --- test.py | 96 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 62 insertions(+), 34 deletions(-) diff --git a/test.py b/test.py index 11e0e113..d5a9ee39 100644 --- a/test.py +++ b/test.py @@ -2,60 +2,88 @@ import sys import os import time +import math +import subprocess #obd.logger.setLevel(obd.logging.DEBUG) -from multiprocessing.connection import Listener - -address = ('127.0.0.1', 6000) # family is deduced to be 'AF_INET' -listener = Listener(address) -conn = listener.accept() -print("listener accepted") - from threading import * ports = obd.scan_serial() -print (ports) +#print (ports) connection = obd.OBD(fast=True, timeout=30, check_voltage=False) # auto-connects to USB or RF port cmd = obd.commands.SPEED # select an OBD command (sensor) -#response = connection.query(cmd) # send the command, and parse the response +response = connection.query(cmd) # send the command, and parse the response #print(response.value) # returns unit-bearing values thanks to Pint #print(response.value.to("mph")) # user-friendly unit conversions screen_lock = Semaphore(value=1) +speed = 0 +rpm = 0 +middle = "" +msg = "" + +#rpmarr = [6786,5554,3334,6753,3256] +#speedarr = [20,30,40,60,80] def speedandrpm(): - while(True): - time.sleep(0.8) - screen_lock.acquire() - rpm = connection.query(obd.commands.RPM).value.magnitude - print(rpm) - speed = connection.query(cmd) - screen_lock.release() - print(speed) + global speed + global rpm + while(True): + time.sleep(0.2) + screen_lock.acquire() + try: + rpm = int(connection.query(obd.commands.RPM).value.magnitude) + print(rpm) + speed = int(connection.query(cmd).value.magnitude) + except: + print('RPM, Speed read error') + screen_lock.release() + print(speed) + def voicerec(): - while(True): - msg = conn.recv() #Recieve the message from porcupine... - if msg == 'picovoice': - print("Fuel level is: " + str(connection.query(obd.commands.FUEL_LEVEL).value)) - #break - elif msg == 'porcupine': - print("Runtime is: " + str(connection.query(obd.commands.RUN_TIME).value)) - #break - #listener.close() - #rpms= str(rpm) - #rpms = reverse(rpms) - #output = 'python3 display.py' - #output = output + ' ' + rpms - #os.system(output) + #time.sleep(10) + global middle + global msg + while(True): + msg = porcupineproc.stdout.readline().rstrip('\n') + if msg == 'picovoice': + print('picovoice detected') + screen_lock.acquire() + middle = str(connection.query(obd.commands.FUEL_LEVEL).value.magnitude) + screen_lock.release() + elif msg == 'porcupine': + screen_lock.acquire() + middle = str(connection.query(obd.commands.RUN_TIME).value.magnitude) + screen_lock.release() + #process.poll() + print(middle) +def runGUI(): + time.sleep(20) + global speed + global rpm + global middle + while(True): + time.sleep(.1) + screen_lock.acquire() + val = str(speed)+','+str(rpm) + ',' + middle + '\n' + guiprocess.stdin.write(val) + screen_lock.release() + #print(val) t1 = Thread(target = speedandrpm) +porcupineproc = subprocess.Popen(['python3', '../porcupine-pi/demo/python/porcupine_demo_mic.py', '--keywords=porcupine,picovoice','--input_audio_device_index', '3'], stdout=subprocess.PIPE, universal_newlines=True) t2 = Thread(target = voicerec) - -t1.start() +guiprocess = subprocess.Popen(['python3', '../SeniorDesignGUI/GUI.py'], stdin=subprocess.PIPE, bufsize=1, universal_newlines=True, cwd='../SeniorDesignGUI/') +t3 = Thread(target = runGUI) t2.start() +t1.start() +t3.start() + + + +#listener.close() -listener.close()