Переглянути джерело

Работа с алгоритмами

TelenkovDmitry 2 роки тому
батько
коміт
e71955209f
3 змінених файлів з 178 додано та 1 видалено
  1. 57 1
      algorithm/galg.py
  2. 112 0
      metrolog/metrolog_m3.py
  3. 9 0
      misc.py

+ 57 - 1
algorithm/galg.py

@@ -1,5 +1,6 @@
 # Бинарный поиск
 # Этот алгорит работает только с отсортированными массивами
+
 def binary_search(list, item):
     low = 0
     high = len(list) - 1
@@ -15,5 +16,60 @@ def binary_search(list, item):
             low = mid + 1
     return None
 
-print(binary_search([1,3,5,7,9,10,14,16,18], 16))
+# print(binary_search([1,3,5,7,9,10,14,16,18], 16))
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+# Поиск наименьшего элемента массива
+def find_smallest(arr):
+    smallest = arr[0]
+    smallest_index = 0
+    for i in range(1, len(arr)):
+        if arr[i] < smallest:
+            smallest = arr[i]
+            smallest_index = i
+    return smallest_index
+
+# Сортировка выбором
+def selection_sort(arr):
+    new_arr = []
+    for i in range(len(arr)):
+        smallest = find_smallest(arr)
+        new_arr.append(arr.pop(smallest))
+    return new_arr
+
+# print(selection_sort([5,3,6,4,7,1,3,2]))
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+# Быстрый поиск
+def quick_sort(arr):
+    if len(arr) < 2:
+        print(f'Return: {arr}')
+        return arr
+    else:
+        pivot = arr[0]
+        less = [i for i in arr[1:] if i <= pivot]
+        greater = [i for i in arr[1:] if i > pivot]
+        print(f'Pivot: {pivot}')
+        print(f'Less: {less}')
+        print(f'Greater: {greater}')
+        return quick_sort(less) + [pivot] + quick_sort(greater)
+    
+
+print(quick_sort([5,3,6,4,7,1,3,2]))
+
+def arr_test(arr):
+    return [i for i in arr[1:]]
+
+# print(arr_test([5,3,6,4,7,1,3,2]))
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+# Разное
+
 

+ 112 - 0
metrolog/metrolog_m3.py

@@ -0,0 +1,112 @@
+import subprocess
+import os
+import socket
+from datetime import datetime
+
+class AnnounceM3():
+    """Container and parser for M2 UDP announce data"""
+    # '{model};{serial};{mac};{sw_ver};{button_set};{button_mode};{stm32_id};{uptime};{production_date};{test_state};{button_box};'
+
+    def __init__(self, model, serial, mac, sw_ver, button_set, button_mod,
+                stm32_id, uptime, prod_date, test_state, button_box):
+        self.model = model 
+        self.serial = serial
+        self.mac = mac
+        self.sw_ver = sw_ver
+        self.button_set = button_set
+        self.button_mod = button_mod
+        self.stm32_id = stm32_id
+        self.uptime = uptime
+        self.prod_date = prod_date
+        self.test_state = test_state
+        self.button_box = button_box
+
+    @classmethod
+    def parse(cls, raw):
+        """Parse raw bytes from received datagram"""
+        if not isinstance(raw, str):
+            try:
+                raw = raw.decode()
+            except Exception as e:
+                return
+        sp = raw.split(';')
+        return cls(sp[0], sp[1], sp[2], sp[3], sp[4], sp[5], sp[6], sp[7], sp[8], sp[9], sp[10])
+
+    def print_members(self):
+        print(f'Модель: {self.model}')
+        print(f'Серийный номер: {self.serial}')
+        print(f'MAC: {self.mac}')
+        print(f'Версия сновной прошивки: {self.sw_ver}')
+        print(f'Кнопка "УСТАНОВКА": {self.button_set}')
+        print(f'Кнопка "РЕЖИМ": {self.button_mod}')
+        print(f'Тампер: {self.button_box}')
+        print(f'STM32_ID: {self.stm32_id}')
+        print(f'Время работы (uptime): {self.uptime}')
+        print(f'Дата производства: {self.prod_date}')
+        print(f'Статус тестирвоания: {self.test_state}')
+        
+
+
+class Metrolog_M3():
+    """Metrolog-M3 board service client"""
+    ANNOUNCE_TIMEOUT = 5
+    ANNOUNCE_PORT = 49049
+
+    def __init__(self, ip):
+        self.ip = ip
+
+    def ping(self):
+        """Test connection with device using ping"""
+        null = open(os.devnull)
+        try:
+            subprocess.check_call(['ping', '-n', '1',  self.ip],
+                                   timeout=10, stdout=null, stderr=null)
+            print("Ping - OK")
+            return True
+        except (subprocess.CalledProcessError, subprocess.TimeoutExpired):
+            return False
+
+    @staticmethod
+    def announce_socket():
+        """Create socket to receive announce messages"""
+        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+        sock.settimeout(.5)
+        sock.bind(('', Metrolog_M3.ANNOUNCE_PORT))
+        return sock
+
+    def wait_announce(self, timeout=None, get_ip=False):
+        """Wait next UDP announce from device"""
+        if timeout is None:
+            self.timeout = self.ANNOUNCE_TIMEOUT
+        sock = self.announce_socket()
+        start = datetime.now()
+        while True:
+            try:
+                raw, address = sock.recvfrom(4096)
+            except socket.timeout:
+                pass
+            else:
+                announce = AnnounceM3.parse(raw)
+                if announce is not None:
+                    if address[0] == self.ip:
+                        print("Контроллер найден")
+                        return announce
+            finally:
+                if (datetime.now() - start).seconds > self.timeout:
+                    print("Превышено время ожидания запроса")
+                    return None
+            
+
+
+# b'\xd0\x9c\xd0\xb5\xd1\x82\xd1\x80\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3 M3.4.3;7030000;B6-C1-EF-9C-FB-00;1.016t;false;false;5A0037001451313136393333;1221;00.00.00;;false;'
+
+metrolog = Metrolog_M3("192.168.25.6")
+# print(metrolog.wait_announce())
+ann = metrolog.wait_announce()
+ann.print_members()
+
+
+# announce = AnnounceM3()
+# metrolog.ping()
+# print(datetime.now())

+ 9 - 0
misc.py

@@ -78,3 +78,12 @@ def narcissistic(value):
     return value == sum(int(x) ** len(str(value)) for x in str(value))
 
 # print(narcissistic(371))
+
+import string
+
+
+# Генератор словаря
+def dict_generate():
+    return {x: string.ascii_uppercase[x-1] for x in range(1,21)}
+
+print(dict_generate())