The constructor gets an sl object on initalization. The card handler will then carry out the reader operation wait_for_card(). In cases where an mechanically automated card reader is used it may be useful to go without those operations and let the caller carry out the appropriate reader operations. So Lets make the sl object optional for the CardHandlerAuto class. If it is not present, simply do not carry out the pre programmed reader operation. Change-Id: I0f793aec51751b7c7b87d55b66326cce9970274e Related: SYS#5617
109 lines
2.8 KiB
Python
109 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
""" pySim: card handler utilities
|
|
"""
|
|
|
|
#
|
|
# (C) 2019 by Sysmocom s.f.m.c. GmbH
|
|
# All Rights Reserved
|
|
#
|
|
# 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, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
|
|
|
|
import subprocess
|
|
import sys
|
|
import yaml
|
|
|
|
# Manual card handler: User is prompted to insert/remove card from the reader.
|
|
class CardHandler:
|
|
|
|
sl = None
|
|
|
|
def __init__(self, sl):
|
|
self.sl = sl
|
|
|
|
def get(self, first = False):
|
|
print("Ready for Programming: Insert card now (or CTRL-C to cancel)")
|
|
self.sl.wait_for_card(newcardonly=not first)
|
|
|
|
def error(self):
|
|
print("Programming failed: Remove card from reader")
|
|
print("")
|
|
|
|
def done(self):
|
|
print("Programming successful: Remove card from reader")
|
|
print("")
|
|
|
|
# Automatic card handler: A machine is used to handle the cards.
|
|
class CardHandlerAuto:
|
|
|
|
sl = None
|
|
cmds = None
|
|
verbose = True
|
|
|
|
def __init__(self, sl, config_file):
|
|
print("Card handler Config-file: " + str(config_file))
|
|
self.sl = sl
|
|
with open(config_file) as cfg:
|
|
self.cmds = yaml.load(cfg, Loader=yaml.FullLoader)
|
|
|
|
self.verbose = (self.cmds.get('verbose') == True)
|
|
|
|
def __print_outout(self,out):
|
|
print("")
|
|
print("Card handler output:")
|
|
print("---------------------8<---------------------")
|
|
stdout = out[0].strip()
|
|
if len(stdout) > 0:
|
|
print("stdout:")
|
|
print(stdout)
|
|
stderr = out[1].strip()
|
|
if len(stderr) > 0:
|
|
print("stderr:")
|
|
print(stderr)
|
|
print("---------------------8<---------------------")
|
|
print("")
|
|
|
|
def __exec_cmd(self, command):
|
|
print("Card handler Commandline: " + str(command))
|
|
|
|
proc = subprocess.Popen([command], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
|
|
out = proc.communicate()
|
|
rc = proc.returncode
|
|
|
|
if rc != 0 or self.verbose:
|
|
self.__print_outout(out)
|
|
|
|
if rc != 0:
|
|
print("")
|
|
print("Error: Card handler failure! (rc=" + str(rc) + ")")
|
|
sys.exit(rc)
|
|
|
|
def get(self, first = False):
|
|
print("Ready for Programming: Transporting card into the reader-bay...")
|
|
self.__exec_cmd(self.cmds['get'])
|
|
if self.sl:
|
|
self.sl.connect()
|
|
|
|
def error(self):
|
|
print("Programming failed: Transporting card to the error-bin...")
|
|
self.__exec_cmd(self.cmds['error'])
|
|
print("")
|
|
|
|
def done(self):
|
|
print("Programming successful: Transporting card into the collector bin...")
|
|
self.__exec_cmd(self.cmds['done'])
|
|
print("")
|