#!/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 . """ 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()