Move init_reader() from utils.py to transport/__init__.py
This avoids a circular dependency when introducing type annotations.
Change-Id: I168597ac14497fb188a15cb632f32452128bc1c6
diff --git a/pySim-prog.py b/pySim-prog.py
index 662824c..7b1283b 100755
--- a/pySim-prog.py
+++ b/pySim-prog.py
@@ -34,8 +34,9 @@
import json
from pySim.commands import SimCardCommands
+from pySim.transport import init_reader
from pySim.cards import _cards_classes, card_detect
-from pySim.utils import h2b, swap_nibbles, rpad, derive_milenage_opc, calculate_luhn, dec_iccid, init_reader
+from pySim.utils import h2b, swap_nibbles, rpad, derive_milenage_opc, calculate_luhn, dec_iccid
from pySim.ts_51_011 import EF
from pySim.card_handler import *
from pySim.utils import *
diff --git a/pySim-read.py b/pySim-read.py
index 638bd4b..59c5762 100755
--- a/pySim-read.py
+++ b/pySim-read.py
@@ -33,9 +33,10 @@
from pySim.ts_31_103 import EF_IST_map, EF_ISIM_ADF_map
from pySim.commands import SimCardCommands
+from pySim.transport import init_reader
from pySim.cards import card_detect, Card, UsimCard, IsimCard
from pySim.utils import h2b, swap_nibbles, rpad, dec_imsi, dec_iccid, dec_msisdn
-from pySim.utils import format_xplmn_w_act, dec_spn, dec_st, init_reader, dec_addr_tlv
+from pySim.utils import format_xplmn_w_act, dec_spn, dec_st, dec_addr_tlv
from pySim.utils import h2s, format_ePDGSelection
def parse_options():
diff --git a/pySim-shell.py b/pySim-shell.py
index d27deb7..ef76cb2 100755
--- a/pySim-shell.py
+++ b/pySim-shell.py
@@ -37,9 +37,10 @@
from pySim.exceptions import *
from pySim.commands import SimCardCommands
+from pySim.transport import init_reader
from pySim.cards import card_detect, Card
from pySim.utils import h2b, swap_nibbles, rpad, h2s
-from pySim.utils import dec_st, init_reader, sanitize_pin_adm, tabulate_str_list, is_hex
+from pySim.utils import dec_st, sanitize_pin_adm, tabulate_str_list, is_hex
from pySim.card_handler import card_handler
from pySim.filesystem import CardMF, RuntimeState, CardDF, CardADF
diff --git a/pySim/transport/__init__.py b/pySim/transport/__init__.py
index f946af8..24d7521 100644
--- a/pySim/transport/__init__.py
+++ b/pySim/transport/__init__.py
@@ -3,6 +3,8 @@
""" pySim: PCSC reader transport link base
"""
+from typing import Optional
+
from pySim.exceptions import *
from pySim.utils import sw_match
@@ -103,3 +105,30 @@
if not sw_match(rv[1], sw):
raise SwMatchError(rv[1], sw.lower())
return rv
+
+def init_reader(opts) -> Optional[LinkBase]:
+ """
+ Init card reader driver
+ """
+ sl = None # type : :Optional[LinkBase]
+ try:
+ if opts.pcsc_dev is not None:
+ print("Using PC/SC reader interface")
+ from pySim.transport.pcsc import PcscSimLink
+ sl = PcscSimLink(opts.pcsc_dev)
+ elif opts.osmocon_sock is not None:
+ print("Using Calypso-based (OsmocomBB) reader interface")
+ from pySim.transport.calypso import CalypsoSimLink
+ sl = CalypsoSimLink(sock_path=opts.osmocon_sock)
+ elif opts.modem_dev is not None:
+ print("Using modem for Generic SIM Access (3GPP TS 27.007)")
+ from pySim.transport.modem_atcmd import ModemATCommandLink
+ sl = ModemATCommandLink(device=opts.modem_dev, baudrate=opts.modem_baud)
+ else: # Serial reader is default
+ print("Using serial reader interface")
+ from pySim.transport.serial import SerialSimLink
+ sl = SerialSimLink(device=opts.device, baudrate=opts.baudrate)
+ return sl
+ except Exception as e:
+ print("Card reader initialization failed with exception:\n" + str(e))
+ return None
diff --git a/pySim/utils.py b/pySim/utils.py
index a784b7e..3e27e3f 100644
--- a/pySim/utils.py
+++ b/pySim/utils.py
@@ -650,33 +650,6 @@
return pin_adm
-def init_reader(opts):
- """
- Init card reader driver
- """
- try:
- if opts.pcsc_dev is not None:
- print("Using PC/SC reader interface")
- from pySim.transport.pcsc import PcscSimLink
- sl = PcscSimLink(opts.pcsc_dev)
- elif opts.osmocon_sock is not None:
- print("Using Calypso-based (OsmocomBB) reader interface")
- from pySim.transport.calypso import CalypsoSimLink
- sl = CalypsoSimLink(sock_path=opts.osmocon_sock)
- elif opts.modem_dev is not None:
- print("Using modem for Generic SIM Access (3GPP TS 27.007)")
- from pySim.transport.modem_atcmd import ModemATCommandLink
- sl = ModemATCommandLink(device=opts.modem_dev, baudrate=opts.modem_baud)
- else: # Serial reader is default
- print("Using serial reader interface")
- from pySim.transport.serial import SerialSimLink
- sl = SerialSimLink(device=opts.device, baudrate=opts.baudrate)
- return sl
- except Exception as e:
- print("Card reader initialization failed with exception:\n" + str(e))
- return None
-
-
def enc_ePDGSelection(hexstr, mcc, mnc, epdg_priority='0001', epdg_fqdn_format='00'):
"""
Encode ePDGSelection so it can be stored at EF.ePDGSelection or EF.ePDGSelectionEm.