From d5d1fab3bdd7f4dc65118a0fe0bc875a050e1914 Mon Sep 17 00:00:00 2001 From: Rossen Georgiev Date: Tue, 30 Dec 2014 15:34:58 +0000 Subject: [PATCH] added pass generation function --- aprslib/__init__.py | 6 +++++- aprslib/passcode.py | 34 ++++++++++++++++++++++++++++++++++ tests/test_passcode.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 aprslib/passcode.py create mode 100644 tests/test_passcode.py diff --git a/aprslib/__init__.py b/aprslib/__init__.py index d0a1637..50fd689 100644 --- a/aprslib/__init__.py +++ b/aprslib/__init__.py @@ -29,12 +29,16 @@ del _date __version__ = "0.6.31" __author__ = "Rossen Georgiev" -__all__ = ['IS', 'parse'] +__all__ = ['IS', 'parse', 'passcode'] from .parse import parse as refparse parse = refparse del refparse +from .passcode import passcode as refpasscode +passcode = refpasscode +del refpasscode + from .IS import IS as refIS diff --git a/aprslib/passcode.py b/aprslib/passcode.py new file mode 100644 index 0000000..c164bf6 --- /dev/null +++ b/aprslib/passcode.py @@ -0,0 +1,34 @@ +# aprs - Python library for dealing with APRS +# Copyright (C) 2013-2014 Rossen Georgiev +# +# 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 2 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, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +""" +Contains a function for generating passcode from callsign +""" + + +def passcode(callsign): + """ + Takes a CALLSIGN and returns passcode + """ + assert isinstance(callsign, str) + + callsign = callsign.split('-')[0].upper() + + code = 0x73e2 + for i, char in enumerate(callsign): + code ^= ord(char) << (8 if not i % 2 else 0) + + return code & 0x7fff diff --git a/tests/test_passcode.py b/tests/test_passcode.py new file mode 100644 index 0000000..af51566 --- /dev/null +++ b/tests/test_passcode.py @@ -0,0 +1,30 @@ +import unittest +from aprslib import passcode + + +class TC_pascode(unittest.TestCase): + def test_nonstring(self): + with self.assertRaises(AssertionError): + passcode(5) + + def test_valid_input(self): + testData = [ + ['TESTCALL', 31742], + ['testcall', 31742], + ['tEsTcAlL', 31742], + ['tEsTcAlL', 31742], + ['TESTCALL-', 31742], + ['TESTCALL-12', 31742], + ['TESTCALL-0', 31742], + ['N0CALL', 13023], + ['SUCHCALL', 27890], + ['MUCHSIGN', 27128], + ['WOW', 29613], + ] + + results = [] + + for callsign, x in testData: + results.append([callsign, passcode(callsign)]) + + self.assertEqual(testData, results)