71 lines
2.1 KiB
Python
71 lines
2.1 KiB
Python
#!/usr/bin/env python
|
|
|
|
import serial
|
|
import serial.rs485
|
|
import time
|
|
import packet
|
|
import crc
|
|
import RPi.GPIO as GPIO
|
|
|
|
def read_reply(sport):
|
|
return sport.read(13)
|
|
|
|
def print_echo(s, count, before, after):
|
|
barr = bytearray(s)
|
|
print('Rx: %s' % (('STGT','xxxx', 'ARM ', 'GO ', 'PING')[barr[6]]) ),
|
|
for b in barr:
|
|
print(" %02x" % b),
|
|
print(" [%d src=%04x %1.3fms]" % (count, (ord(s[8])<<8)|ord(s[7]), (after-before)*1000))
|
|
|
|
|
|
def ping_packet(address):
|
|
return packet.ping(address)
|
|
|
|
def send_packet(sport, s):
|
|
sport.rts = False # Set high... logic inverted
|
|
sport.write([s[0]])
|
|
for c in s[1:]:
|
|
if c == 0xfe or c == 0xff:
|
|
print('escape')
|
|
sport.write([0xfe])
|
|
sport.write([c])
|
|
time.sleep(.01) # Delay
|
|
sport.rts = True # Set low... logic inverted
|
|
|
|
def main():
|
|
|
|
count = 0
|
|
|
|
#for b in packet_build(0x0001, 0x42, [0x04, 0xaa, 0x55]):
|
|
# print("%02x" % b)
|
|
#return
|
|
|
|
with serial.Serial('/dev/ttyAMA0', 38400) as ser:
|
|
ser.rts = False # setting it to high. The logic is negated. What a mess.
|
|
# ser.rs485_mode = serial.rs485.RS485Settings(rts_level_for_tx=True, rts_level_for_rx=False, loopback=False)
|
|
while True:
|
|
count += 1
|
|
# 22 col instead of 23 now
|
|
# XXX
|
|
for addr in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]:
|
|
#for addr in [1, 2, 3, 4, 5, 6, 7, 8]:
|
|
before = time.clock()
|
|
packet.send(ser, ping_packet(addr))
|
|
s = read_reply(ser)
|
|
after = time.clock()
|
|
print_echo(s, count, before, after)
|
|
barr = bytearray(s)
|
|
crc_data = crc.CRC32(barr, len(barr)-4)
|
|
#for b in barr:
|
|
# print(" %02x" % b),
|
|
crc_rcvd = (barr[len(barr)-1] << 24) |(barr[len(barr)-2] << 16) | (barr[len(barr)-3] << 8) | (barr[len(barr)-4] << 0);
|
|
if (crc_rcvd != crc_data):
|
|
print(" [!CRC]"),
|
|
print("")
|
|
ser.flush()
|
|
time.sleep(.250)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|