Flipper/Sub-GHz/Restaurant_Pagers/LRS_Pagers/thanks_tony-tiger/lrs_pager.py

125 lines
3.4 KiB
Python

#!/usr/bin/python
"""
Written by: Tony Tiger 6/2019
This program generates manchester encoded data packets for LRS pagers and GNU Radio.
Output file name: pager.bin
Watch the YouTube video for more information: https://www.youtube.com/watch?v=ycLLb4eVZpI
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
import sys
import re
import struct
def encode_manchester( bin_list ):
pre = [] # create extra preambles to wake up the pager
for x in range(0,50):
pre.append('1')
pre.append('0')
l = re.findall('.', "".join( pre + bin_list ) ) # join the preamble and the rest of the packet
m = []
print '\n'
print "".join(str(x) for x in l) # convert list to string
for x in l: # convert to manchaster coding
if( x == '0'):
m.append(1)
m.append(0)
if( x == '1'):
m.append(0)
m.append(1)
return m
# calculate the crc
def calculate_crc( pre, sink_word, rest_id, station_id, pager_n, alert_type ):
l = re.findall('..', pre + sink_word + rest_id + station_id + pager_n + '0000000000' + alert_type )
bin_array = []
for c in l:
bin_array.append ( (format( int(c, 16) , '08b')))
sum=0
for b in bin_array:
sum += int(b , 2)
print '\n{0} {1} {2} {3} {4} {5} {6} {7}'.format( pre, sink_word, rest_id, station_id, pager_n, '0000000000', alert_type, format( ( sum % 255), '02x' ))
bin_array.append( format( ( sum % 255), '08b') )
return bin_array
##########################################
# main program start #
##########################################
try:
rest_id=int(raw_input('\nEnter restaurant id 0-255: '))
except ValueError:
print "Not a number"
try:
pagers=(raw_input('Enter one or more pager numbers 0-1023 : '))
except ValueError:
print "Not a number"
pager_list = []
pager_list = map( int, re.split('\s+',pagers))
print '1 Flash 30 Seconds\n2 Flash 5 Minutes\n3 Flash/Beep 5X5\n4 Beep 3 Times\n5 Beep 5 Minutes\n6 Glow 5 Minutes\n7 Glow/Vib 15 Times\n10 Flash/Vib 1 Second\n68 beep 3 times\n'
try:
alert_type=int(raw_input('Enter alert type: '))
except ValueError:
print "Not a number"
handle = open('pager.bin', 'wb')
data = []
for pager_n in pager_list:
crc_out = ( calculate_crc( format(11184810, '06x') , format( 64557,'04x'), format(rest_id, '02x'), '0', format( pager_n ,'03x' ), format(alert_type, '02x') ) )
data = encode_manchester( crc_out )
[ data.append(0) for x in range(0,100) ]
print '\n';
print "".join(str(x) for x in data)
print '\n'
for d in data:
if d == 0:
handle.write(struct.pack('f', .0001))
elif d == 1:
handle.write(struct.pack('f', 1))
else:
print "Error detected in data"
sys.exit()
handle.close()