Skip to content
Snippets Groups Projects
Commit 1bee8dd7 authored by Dónal Murray's avatar Dónal Murray
Browse files

Add Arduino emulator and very short dumpfile of noise to be overwritten by real data

parent a4784a62
No related branches found
No related tags found
No related merge requests found
#!/usr/bin/env python3
import asyncio
import logging
import time
import argparse
import os
import binascii
from serial import Serial
from pathlib import Path
from subprocess import Popen
from struct import error as StructError
from CommsLLI import CommsLLI
from CommsCommon import PayloadFormat, PAYLOAD_TYPE
from CommsFormat import CommsPacket, CommsACK, CommsNACK, CommsChecksumError, generateAlarm, generateCmd, generateData
# Set up logging
logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')
logging.getLogger().setLevel(logging.WARNING)
class ArduinoEmulator:
def __init__(self, lli, dumpfile=os.path.dirname(__file__)+'/share/dump.dump'):
self._lli = lli
self._dumpfile = dumpfile
async def generator(self):
try:
while True:
with open(self._dumpfile,'r') as f:
for line in f:
# snip off the b''\n surrounding the hexstring
payload = PayloadFormat.fromByteArray(binascii.unhexlify(line[2:-2]))
if not self._lli.writePayload(payload):
logging.error(f"Failed to send payload: {payload}")
await asyncio.sleep(0.02)
except FileNotFoundError:
logging.critical("File not found")
exit(0)
async def receiver(self):
payload = await self._lli._payloadrecv.get()
logging.info(f"received packet {payload}")
if __name__ == "__main__":
try:
# set up and link interfaces
logging.debug("Setting up devices")
socat = Popen(f"/bin/socat -d -d pty,rawer,echo=0,link={str(Path.home())}/hev-sw/ttyEMU0 pty,rawer,echo=0,link={str(Path.home())}/hev-sw/ttyEMU1".split())
time.sleep(2)
logging.info("Setting up devices [DONE]")
# schedule async tasks
loop = asyncio.get_event_loop()
parser = argparse.ArgumentParser(description='Arguments to run hevserver')
parser.add_argument('-f', '--file', type=str, default = os.path.dirname(__file__)+'/share/dump.dump', help='File to load from')
args = parser.parse_args()
# setup serial devices
logging.info(f"Using file {args.file}")
comms = CommsLLI(loop)
emulator = ArduinoEmulator(lli=comms, dumpfile=args.file)
# queue tasks
lli = comms.main(str(Path.home())+'/hev-sw/ttyEMU1', 115200)
gen = emulator.generator()
recv = emulator.receiver()
tasks = [lli, gen, recv]
# run tasks
asyncio.gather(*tasks, return_exceptions=True)
loop.run_forever()
except asyncio.CancelledError:
pass
except KeyboardInterrupt:
logging.info("Closing Emulator")
finally:
try:
socat.kill()
except NameError:
pass
try:
loop.close()
except (RuntimeError, NameError):
#loop already closed
pass
......@@ -11,6 +11,7 @@ import threading
import argparse
import svpi
import hevfromtxt
from pathlib import Path
from hevtestdata import HEVTestData
from CommsLLI import CommsLLI
from CommsCommon import PAYLOAD_TYPE, CMD_TYPE, CMD_GENERAL, CMD_SET_DURATION, VENTILATION_MODE, ALARM_TYPE, ALARM_CODES, CMD_MAP, CommandFormat, AlarmFormat
......@@ -238,6 +239,7 @@ def getArduinoPort():
async def arduinoConnected():
# TODO make this smarter and only run when no data has been seen for a while
# TODO make a version to check the arduino emulator - low priority
while True:
await asyncio.sleep(1)
getArduinoPort()
......@@ -252,6 +254,7 @@ if __name__ == "__main__":
parser.add_argument('-i', '--inputFile', type=str, default = '', help='Load data from file')
parser.add_argument('-d', '--debug', action='count', default=0, help='Show debug output')
parser.add_argument('--use-test-data', action='store_true', help='Use test data source')
parser.add_argument('--use-dump-data', action='store_true', help='Use dump data source')
args = parser.parse_args()
if args.debug == 0:
logging.getLogger().setLevel(logging.WARNING)
......@@ -272,13 +275,16 @@ if __name__ == "__main__":
else:
# initialise low level interface
try:
port_device = getArduinoPort()
connected = arduinoConnected()
if args.use_dump_data:
port_device = str(Path.home())+'/hev-sw/ttyEMU0'
else:
port_device = getArduinoPort()
connected = arduinoConnected()
tasks.append(connected)
# setup serial device and init server
lli = CommsLLI(loop)
comms = lli.main(port_device, 115200)
tasks.append(comms)
tasks.append(connected)
logging.info(f"Serving data from device {port_device}")
except NameError:
logging.critical("Arduino not connected")
......
b'a9693c00000101050000d0bf3f030000d48e4100388b40006c814000eecb410400baa3003a00000000000000000000000000000000'
b'a97d3c0000010104000010c83f030000b38e4100609040000885400051cc410400dc44d43900000000000000000000000000000000'
b'a9873c00000101130000e4314116007f0f2942ff8acb410122c241ffc95742180000574a3c00000000000000000000000000000000'
b'a9913c000001010400ff7fd63f030000dd8b4100488d40000084400021c64104002fca023a00000000000000000000000000000000'
b'a99b3c00000101120000b42b411600808b284200a4ca4100c0bd41802459421800632c3b3c00000000000000000000000000000000'
b'a9a53c000001010400ffdfc13f0300007a8b4100288940ffbf7f40005ac9410400951aa83900000000000000000000000000000000'
b'a9b93c000001010400ff3fad3f030000598b410000844000807740ff40ca4104009a1caf3900000000000000000000000000000000'
b'a9c33c00000101120000583041160000392842003ac54100a8ba41004657421800cd5b2b3c00000000000000000000000000000000'
b'a9cd3c0000010104000040ce3f030000ab8d4100008440ff1f6b40006bc74103009465d03900000000000000000000000000000000'
b'a9d73c00000101120000082641160000282a4200aec34100e2b941005f56421800b3ac363c00000000000000000000000000000000'
b'a9d83c00000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
b'a9eb3c00000101130000202941160001a429420042c6410166ba41007f5a42180050ac433c00000000000000000000000000000000'
b'a9f53c000001010400ff3fad3f030000178b410000844001406f40ff62c64103009ae2b93900000000000000000000000000000000'
b'a9ff3c000001011300ff3f2d41170080602f42ff79cd410032c441002c5c4218006c6b3e3c00000000000000000000000000000000'
b'a9093d00000101040000c09c3f030000618c4100e8804001406f40014ac74103009465d03900000000000000000000000000000000'
b'a91d3d000001010300ff7f563f0200ff19624100482e4000500e400069ae410200145c093900000000000000000000000000000000'
b'a9313d0000010104000030ab3f030000ef854100e8804000807740ff95c0410300d4dd9d3900000000000000000000000000000000'
b'a93b3d000001011300ff9540411700009a304201fbd941ffa1d241011261421900e465593c00000000000000000000000000000000'
b'a93c3d0000021027580258026400580200000000b0040a004006c800000000000000000005010006000001010100000000a040c1162c3f'
b'a9453d0000010103000080b53f0300008c854100a07b4000286c4000d0bf410300efa8a43900000000000000000000000000000000'
b'a9473d0000076f12833b6f12833a00000000000000000000000000000000000000000000000000000000'
b'a9593d0000010103000050af3f03000094864100f08140ff1f6b40019fbd410300edfac43900000000000000000000000000000000'
b'a9633d000001011400001651411800801c37420010e9410123df417fa565421a00c0d6663c00000000000000000000000000000000'
b'a9773d000001011500ffc957411800003d39420071f14100deea41000868421b000e6c603c00000000000000000000000000000000'
b'a9813d0000010103000020a93f020000c7804100e8804000507140ff7eb9410300722a763900000000000000000000000000000000'
b'a98b3d000001011500010c5841180080a838420005f4410162eb41005a6a421b00d0e7763c00000000000000000000000000000000'
b'a9953d00000101030000c09c3f020000347e41ffbf7f40ffcf6040006fb7410300693a873900000000000000000000000000000000'
b'a9973d000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000339388c3'
b'a99f3d000001011500010c584118007f2c3942009af2410011e541004a68421b00c0d6663c00000000000000000000000000000000'
b'a9a93d00000101030000a0983f0300016e7d410168744001a05a40012db7410300c9dc533900000000000000000000000000000000'
b'a9b33d00000101150000fc55411800800b394200a2f341004ae8417f286a421b00c73c553c00000000000000000000000000000000'
b'a9c73d00000101160000e06241180001fa3c42001df7410107ec41804169421b00d08e673c00000000000000000000000000000000'
b'a9d13d000001010400ff3fad3f020000a87c4100e880400000674000dbb4410300e664593900000000000000000000000000000000'
b'a9db3d00000101160000b85d41190000c03d42001cfb410006f041808a6e421b0075ff683c00000000000000000000000000000000'
b'a9e53d0000010103000160b13f020000807741ff6f7540008857400047b2410300be21343900000000000000000000000000000000'
b'a9ef3d000001011600007465411900ff5c3d42004dfd41000ef14101f66d421b0099f1733c00000000000000000000000000000000'
b'a9f93d00000101030000b09a3f020000787641ff1f6b4001284b4000dcb0410300c9dc533900000000000000000000000000000000'
b'a9033e0000010116000022634119007faf3d42ffd0fd4100b3f14180cc6e421b009db0643c00000000000000000000000000000000'
b'a90d3e00000101030000408c3f0200ff91714100006740010046400193ab41030031207c3900000000000000000000000000000000'
b'a9173e000001011600009661411800002c3b42009fff410005f44180936b421c0099f1733c00000000000000000000000000000000'
b'a9213e0000010103000020883f02000184674100e0624000204a400069ae410300dd1e2a3900000000000000000000000000000000'
b'a9353e0000010103000000843f0200ff8b684100484f4000803540007aac410200c9dc533900000000000000000000000000000000'
b'a9493e0000010103000010863f02000184674101505040002029400171af41020050f9163900000000000000000000000000000000'
b'a9533e00000101160000fa5d41190080553a420088f8410027f04181a36d421b002ba6773c00000000000000000000000000000000'
b'a9673e000001011600008e6041180001c1394200b1f94101acec4180c46d421b00d246683c00000000000000000000000000000000'
b'a9683e0000021027580258026400580200000000b0040a004006c800000000000000000005010006000001010100000000a040c1162c3f'
b'a9713e0000010103000000843f020000445f410100464000e02040ff3fad41020050f9163900000000000000000000000000000000'
b'a97b3e00000101160001a663411800809f3b42001cfb410038ee4180cc6e421b0061b8693c00000000000000000000000000000000'
b'a97d3e0000076f12833b6f12833a00000000000000000000000000000000000000000000000000000000'
b'a9853e0000010103000000843f020001ea5b4100282a4000400c40007aac4102008d5c123900000000000000000000000000000000'
b'a98f3e000001011600ffcf6041190000c03d4201c9fc41000ef141808a6e421c0061b8693c00000000000000000000000000000000'
b'a9ad3e00000101030001a05a3f0200ffa75b4100002540001006400039a84102008d5c123900000000000000000000000000000000'
b'a9b73e000001011700015c6241190001e93e4200e1ff41018af041805870421b008c21613c00000000000000000000000000000000'
b'a9c13e00000101030000404e3f020000245b4100002540000004400110a74102008d5c123900000000000000000000000000000000'
b'a9cb3e000001011700013a66411900006d3f420113fe41ff47f041808a6e421b006178723c00000000000000000000000000000000'
b'a9cc3e00000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
b'a9d53e0000010102000100463f0200ff41674100500e400010e93f0121a54102008d5c123900000000000000000000000000000000'
b'a9df3e00000101170001c85f41190001334042801100420016f2417ff56f421b00bd2a6b3c00000000000000000000000000000000'
b'a9e93e0000010102000100463f0200ffeb534100500e40000004400042a5410200145c093900000000000000000000000000000000'
b'a9f33e00000101170000e06241190081f13d42008ffd41ff36f241ff586e421b003e9e6c3c00000000000000000000000000000000'
b'a9fd3e0000010102000100463f020001e4524100500e400080f73f00a5a54102008d5c123900000000000000000000000000000000'
b'a9113f0000010102000020083f0100ffab2a410100c63f0090963f00408c410100b85e123800000000000000000000000000000000'
b'a91b3f0000010117000054614119007f434042809d0142ffcaf441000e71421c0043a27d3c00000000000000000000000000000000'
b'a9253f0000010102000100463f020000ba5541000004400140ef3f00e8a14102008d5c123900000000000000000000000000000000'
b'a92f3f000001011700007c6641190001c74242803a014201a1f74180a271421c00705f833c00000000000000000000000000000000'
b'a9393f0000010102000100463f0200012e5441000004400000e73f00e99d410200b6a2003900000000000000000000000000000000'
b'a9433f00000101170000e863411900004b4342003cff410005f441fffd6e421c00af9b823c00000000000000000000000000000000'
b'a94d3f0000010102000100463f0200ff355541000004400140ef3f00559b4102008d5c123900000000000000000000000000000000'
b'a9573f00000101180000e8634119007fd74242809d01420067f841800e6f421c00b615813c00000000000000000000000000000000'
b'a9613f0000010102000000253f0200006853410080f73f0000e73f00c09c4102008d5c123900000000000000000000000000000000'
b'a97f3f00000101170000c66741190080e7444200cf01420067f8417f2e73421c008ee57f3c00000000000000000000000000000000'
b'a9933f00000101170000b665411900ffce434200a60042ffb9f641005872421c00ee39823c00000000000000000000000000000000'
b'a9953f000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000339388c3'
b'a99d3f0000010102000000043f0200001849410090d83fff8fb73f00129f410200ee2fe83800000000000000000000000000000000'
b'a9a73f00000101170000b85d411900ffdf414200ae0142000cf941004774421c00b615813c00000000000000000000000000000000'
b'a9b13f0000010102000100c63e0200010046410040ce3f0080b53f002b9e4102004fa7a43800000000000000000000000000000000'
b'a9b33f0000076f12833b6f12833a00000000000000000000000000000000000000000000000000000000'
b'a9bb3f000001011800000067411900ff73444200c70042002df941ff2574421c00d7e8843c00000000000000000000000000000000'
b'a9c53f0000010102000000043f0100004246410040ce3f0080b53f005d9c4101004fa7a43800000000000000000000000000000000'
b'a9cf3f00000101170000b66541190080314642808402420025f8417f1d75421c009fc1833c00000000000000000000000000000000'
b'a9d93f0000010102000000043f0100008c474101a0da3f0100c63f00239d41020098c0c83800000000000000000000000000000000'
b'a9ed3f0000010101000080b53e0200012242410100c63f0000a53f00559b410100cb5c8a3800000000000000000000000000000000'
b'a9f73f00000101180001f064411900007c454200b60242017ffb41007876421c009fc1833c00000000000000000000000000000000'
b'a901400000010102000080b53e020001b644410100c63f0160b13f007e9c4102000cb7903800000000000000000000000000000000'
b'a90b4000000101180000be66411900807b474280950042fff2f9417fc275421c009fc1833c00000000000000000000000000000000'
b'a915400000010102000040ce3e0100ffdf414100a0b93f0000a53f00979b410100f246703800000000000000000000000000000000'
b'a91f40000001011700ffcf60411900808c4542002a0142001df74180ca76421c00ee39823c00000000000000000000000000000000'
b'a92940000001010100ff3fad3e0100ff013e410000a53f0000843f0066994101004ab1643800000000000000000000000000000000'
b'a9334000000101170000a46b4119008141484200320242006ff94180a175421c004fae853c00000000000000000000000000000000'
b'a93d400000010101000000843e020000a6424100c09c3f0000843f00fb97410100f0ac433800000000000000000000000000000000'
b'a94740000001011800ff1f6b4119007fa4484280df01420124fc4100ec74421c00d7e8843c00000000000000000000000000000000'
b'a95b4000000101170000946941190080074942002a01420190f94181a976421c00add7863c00000000000000000000000000000000'
b'a965400000010101000000843e0100ffdf414100508e3f00c05e3f003d98410100ec664e3800000000000000000000000000000000'
b'a96f4000000101180000006741190000ff4942009fff410067f84101b275421c004d00713c00000000000000000000000000000000'
b'a979400000010101000000253e0100006442410000843f01a05a3f00b09a410100241fe03700000000000000000000000000000000'
b'a9834000000101170000e66b4119008062484200530242002df941015776421c00add7863c00000000000000000000000000000000'
b'a98d400000010101000000253e0100ffd938410000843f0080353f006f96410100f0ac433800000000000000000000000000000000'
b'a9ab4000000101170000be66411900ff8a4b42806b034201ebf841001d77421c008a617b3c00000000000000000000000000000000'
b'a9b5400000010101000000253e0100ffd938410000843f00404e3f00a9954101004ab1643800000000000000000000000000000000'
b'a9bf40000001011700005a6a41190001de49428008034200c2f741001d77421c0052d8813c00000000000000000000000000000000'
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment