From b6c6de3b185742d0d664638c0817622b4ec5a5a1 Mon Sep 17 00:00:00 2001
From: Anton Sarukhanov <code@ant.sr>
Date: Sun, 10 Jun 2018 13:56:31 -0400
Subject: [PATCH] Refactor all scanning stuff into one function.

---
 turntouch/__init__.py | 70 +++++++++++++++++++++----------------------
 1 file changed, 34 insertions(+), 36 deletions(-)

diff --git a/turntouch/__init__.py b/turntouch/__init__.py
index 791d2e3..d3e0e27 100644
--- a/turntouch/__init__.py
+++ b/turntouch/__init__.py
@@ -4,47 +4,11 @@ from bluepy import btle
 from typing import List
 
 
-TT_DEVICE_NAME = 'Turn Touch Remote'
-TT_SHORT_DEVICE_NAME = 'Turn Touch Rem'
-BLE_SHORT_DEVICE_NAME = 0x08
-BLE_COMPLETE_DEVICE_NAME = 0x09
 logger = logging.getLogger('TurnTouch')
 
 
-class DeviceFoundException(Exception):
-    """Exception thrown when a device is found to abort further scanning."""
-    pass
-
-
-class ScanDelegate(btle.DefaultDelegate):
-    """Handle callbacks for devices discovered by a BLE scan."""
-    only_one = False
-
-    def __init__(self, only_one=False, *args, **kwargs):
-        self.only_one = only_one
-        super(ScanDelegate, self).__init__(*args, **kwargs)
-
-    def handleDiscovery(self, device, is_new_device, is_new_data):
-        """When a Turn Touch device is discovered, log a message.
-        If only searching for one device, short-circuit the scan by raising
-        a DeviceFoundException once we've found a Turn Touch device."""
-        if is_new_device and is_turn_touch(device):
-            logger.info("Discovered device {address}".format(
-                address=device.addr))
-            if self.only_one:
-                raise DeviceFoundException()
-
-
 class TurnTouch(btle.Peripheral):
     """A Turn Touch smart home remote."""
-    pass
-
-
-def is_turn_touch(device: btle.ScanEntry) -> bool:
-    """Determine whether a device found by btle.Scanner is a Turn Touch."""
-    short_name = device.getValueText(BLE_SHORT_DEVICE_NAME)
-    name = device.getValueText(BLE_COMPLETE_DEVICE_NAME)
-    return (name == TT_DEVICE_NAME or short_name == TT_SHORT_DEVICE_NAME)
 
 
 def scan(device_index: int = 0,
@@ -55,6 +19,40 @@ def scan(device_index: int = 0,
     :param timeout float: Scanning timeout, in seconds
     :param only_one float: Stop scanning after one Turn Touch is found
     :return list: Found TurnTouch devices"""
+
+    TT_DEVICE_NAME = 'Turn Touch Remote'
+    TT_SHORT_DEVICE_NAME = 'Turn Touch Rem'
+    BLE_SHORT_DEVICE_NAME = 0x08
+    BLE_COMPLETE_DEVICE_NAME = 0x09
+
+    class DeviceFoundException(Exception):
+        """Exception thrown when a device is found."""
+        pass
+
+    class ScanDelegate(btle.DefaultDelegate):
+        """Handle callbacks for devices discovered by a BLE scan."""
+        only_one = False
+
+        def __init__(self, only_one=False, *args, **kwargs):
+            self.only_one = only_one
+            super(ScanDelegate, self).__init__(*args, **kwargs)
+
+        def handleDiscovery(self, device, is_new_device, is_new_data):
+            """When a Turn Touch device is discovered, log a message.
+            If only searching for one device, short-circuit the scan by raising
+            a DeviceFoundException once we've found a Turn Touch device."""
+            if is_new_device and is_turn_touch(device):
+                logger.info("Discovered device {address}".format(
+                    address=device.addr))
+                if self.only_one:
+                    raise DeviceFoundException()
+
+    def is_turn_touch(device: btle.ScanEntry) -> bool:
+        """Determine whether a ScanEntry (device) is a Turn Touch."""
+        short_name = device.getValueText(BLE_SHORT_DEVICE_NAME)
+        name = device.getValueText(BLE_COMPLETE_DEVICE_NAME)
+        return name == TT_DEVICE_NAME or short_name == TT_SHORT_DEVICE_NAME
+
     scanner = btle.Scanner(device_index)
     try:
         scanner.withDelegate(ScanDelegate(only_one)).scan(timeout)
-- 
GitLab