<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/23595">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">card_handler: clean-up<br><br>* introduce type annotations<br>* introduce + derive implementations from base class<br>* move shared code to base class<br><br>Change-Id: I7168506cbebb1ebb67f47453419b860824912051<br>---<br>M pySim/card_handler.py<br>1 file changed, 63 insertions(+), 26 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pySim/card_handler.py b/pySim/card_handler.py</span><br><span>index 385c55e..0425e33 100644</span><br><span>--- a/pySim/card_handler.py</span><br><span>+++ b/pySim/card_handler.py</span><br><span>@@ -1,6 +1,9 @@</span><br><span> # -*- coding: utf-8 -*-</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-""" pySim: card handler utilities</span><br><span style="color: hsl(120, 100%, 40%);">+""" pySim: card handler utilities.  A 'card handler' is some method</span><br><span style="color: hsl(120, 100%, 40%);">+by which cards can be inserted/removed into the card reader.  For</span><br><span style="color: hsl(120, 100%, 40%);">+normal smart card readers, this has to be done manually.  However,</span><br><span style="color: hsl(120, 100%, 40%);">+there are also automatic card feeders.</span><br><span> """</span><br><span> </span><br><span> #</span><br><span>@@ -21,47 +24,81 @@</span><br><span> # along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span> #</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.transport import LinkBase</span><br><span> </span><br><span> import subprocess</span><br><span> import sys</span><br><span> import yaml</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# Manual card handler: User is prompted to insert/remove card from the reader.</span><br><span style="color: hsl(0, 100%, 40%);">-class CardHandler:</span><br><span style="color: hsl(120, 100%, 40%);">+class CardHandlerBase:</span><br><span style="color: hsl(120, 100%, 40%);">+  """Abstract base class representing a mechanism for card insertion/removal."""</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        sl = None</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       def __init__(self, sl):</span><br><span style="color: hsl(120, 100%, 40%);">+       def __init__(self, sl:LinkBase):</span><br><span>             self.sl = sl</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        def get(self, first = False):</span><br><span style="color: hsl(0, 100%, 40%);">-           print("Ready for Programming: Insert card now (or CTRL-C to cancel)")</span><br><span style="color: hsl(0, 100%, 40%);">-         self.sl.wait_for_card(newcardonly=not first)</span><br><span style="color: hsl(120, 100%, 40%);">+  def get(self, first:bool = False):</span><br><span style="color: hsl(120, 100%, 40%);">+            """Method called when pySim needs a new card to be inserted.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         Args:</span><br><span style="color: hsl(120, 100%, 40%);">+                 first : set to true when the get method is called the</span><br><span style="color: hsl(120, 100%, 40%);">+                         first time. This is required to prevent blocking</span><br><span style="color: hsl(120, 100%, 40%);">+                              when a card is already inserted into the reader.</span><br><span style="color: hsl(120, 100%, 40%);">+                              The reader API would not recognize that card as</span><br><span style="color: hsl(120, 100%, 40%);">+                               "new card" until it would be removed and re-inserted</span><br><span style="color: hsl(120, 100%, 40%);">+                                again.</span><br><span style="color: hsl(120, 100%, 40%);">+                """</span><br><span style="color: hsl(120, 100%, 40%);">+            print("Ready for Programming: ", end='')</span><br><span style="color: hsl(120, 100%, 40%);">+            self._get(first)</span><br><span> </span><br><span>         def error(self):</span><br><span style="color: hsl(0, 100%, 40%);">-                print("Programming failed: Remove card from reader")</span><br><span style="color: hsl(0, 100%, 40%);">-          print("")</span><br><span style="color: hsl(120, 100%, 40%);">+           """Method called when pySim failed to program a card. Move card to 'bad' batch."""</span><br><span style="color: hsl(120, 100%, 40%);">+              print("Programming failed: ", end='')</span><br><span style="color: hsl(120, 100%, 40%);">+               self._error()</span><br><span> </span><br><span>    def done(self):</span><br><span style="color: hsl(0, 100%, 40%);">-         print("Programming successful: Remove card from reader")</span><br><span style="color: hsl(120, 100%, 40%);">+            """Method called when pySim failed to program a card. Move card to 'good' batch."""</span><br><span style="color: hsl(120, 100%, 40%);">+             print("Programming successful: ", end='')</span><br><span style="color: hsl(120, 100%, 40%);">+           self._done()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        def _get(self, first:bool = False):</span><br><span style="color: hsl(120, 100%, 40%);">+           pass</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        def _error(self):</span><br><span style="color: hsl(120, 100%, 40%);">+             pass</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        def _done(self):</span><br><span style="color: hsl(120, 100%, 40%);">+              pass</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class CardHandler(CardHandlerBase):</span><br><span style="color: hsl(120, 100%, 40%);">+ """Manual card handler: User is prompted to insert/remove card from the reader."""</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def _get(self, first:bool = False):</span><br><span style="color: hsl(120, 100%, 40%);">+           print("Insert card now (or CTRL-C to cancel)")</span><br><span style="color: hsl(120, 100%, 40%);">+              self.sl.wait_for_card(newcardonly=not first)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        def _error(self):</span><br><span style="color: hsl(120, 100%, 40%);">+             print("Remove card from reader")</span><br><span>           print("")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# Automatic card handler: A machine is used to handle the cards.</span><br><span style="color: hsl(0, 100%, 40%);">-class CardHandlerAuto:</span><br><span style="color: hsl(120, 100%, 40%);">+ def _done(self):</span><br><span style="color: hsl(120, 100%, 40%);">+              print("Remove card from reader")</span><br><span style="color: hsl(120, 100%, 40%);">+            print("")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- sl = None</span><br><span style="color: hsl(0, 100%, 40%);">-       cmds = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class CardHandlerAuto(CardHandlerBase):</span><br><span style="color: hsl(120, 100%, 40%);">+        """Automatic card handler: A machine is used to handle the cards."""</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         verbose = True</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      def __init__(self, sl, config_file):</span><br><span style="color: hsl(120, 100%, 40%);">+  def __init__(self, sl:LinkBase, config_file:str):</span><br><span style="color: hsl(120, 100%, 40%);">+             super().__init__(sl)</span><br><span>                 print("Card handler Config-file: " + str(config_file))</span><br><span style="color: hsl(0, 100%, 40%);">-                self.sl = sl</span><br><span>                 with open(config_file) as cfg:</span><br><span>                       self.cmds = yaml.load(cfg, Loader=yaml.FullLoader)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>           self.verbose = (self.cmds.get('verbose') == True)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   def __print_outout(self,out):</span><br><span style="color: hsl(120, 100%, 40%);">+ def __print_outout(self, out):</span><br><span>               print("")</span><br><span>          print("Card handler output:")</span><br><span>              print("---------------------8<---------------------")</span><br><span>@@ -91,18 +128,18 @@</span><br><span>                    print("Error: Card handler failure! (rc=" + str(rc) + ")")</span><br><span>                       sys.exit(rc)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        def get(self, first = False):</span><br><span style="color: hsl(0, 100%, 40%);">-           print("Ready for Programming: Transporting card into the reader-bay...")</span><br><span style="color: hsl(120, 100%, 40%);">+    def _get(self, first:bool = False):</span><br><span style="color: hsl(120, 100%, 40%);">+           print("Transporting card into the reader-bay...")</span><br><span>          self.__exec_cmd(self.cmds['get'])</span><br><span>            if self.sl:</span><br><span>                  self.sl.connect()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   def error(self):</span><br><span style="color: hsl(0, 100%, 40%);">-                print("Programming failed: Transporting card to the error-bin...")</span><br><span style="color: hsl(120, 100%, 40%);">+  def _error(self):</span><br><span style="color: hsl(120, 100%, 40%);">+             print("Transporting card to the error-bin...")</span><br><span>             self.__exec_cmd(self.cmds['error'])</span><br><span>          print("")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- def done(self):</span><br><span style="color: hsl(0, 100%, 40%);">-         print("Programming successful: Transporting card into the collector bin...")</span><br><span style="color: hsl(120, 100%, 40%);">+        def _done(self):</span><br><span style="color: hsl(120, 100%, 40%);">+              print("Transporting card into the collector bin...")</span><br><span>               self.__exec_cmd(self.cmds['done'])</span><br><span>           print("")</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/23595">change 23595</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/pysim/+/23595"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: pysim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I7168506cbebb1ebb67f47453419b860824912051 </div>
<div style="display:none"> Gerrit-Change-Number: 23595 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>