sdwire 0.1.1__py3-none-any.whl → 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
sdwire/__init__.py ADDED
File without changes
File without changes
@@ -0,0 +1,68 @@
1
+ import logging
2
+ from typing import List
3
+ from adafruit_board_toolkit import circuitpython_serial as cpserial
4
+ from serial.tools.list_ports_common import ListPortInfo
5
+
6
+ from sdwire import constants
7
+ from .device.sdwire import SDWire
8
+ from .device.sdwirec import SDWireC
9
+ from .device.usb_device import PortInfo
10
+
11
+ import usb.core
12
+ import usb.util
13
+ from usb.core import Device
14
+
15
+ log = logging.getLogger(__name__)
16
+
17
+
18
+ def get_sdwirec_devices() -> List[SDWireC]:
19
+ devices: List[Device] = usb.core.find(find_all=True)
20
+ if not devices:
21
+ log.info("no usb devices found while searching for SDWireC..")
22
+ return []
23
+
24
+ device_list = []
25
+ for device in devices:
26
+ product = None
27
+ serial = None
28
+ manufacturer = None
29
+ try:
30
+ product = device.product
31
+ serial = device.serial_number
32
+ manufacturer = device.manufacturer
33
+ except Exception as e:
34
+ log.debug(
35
+ "not able to get usb product, serial_number and manufacturer information, err: %s",
36
+ e,
37
+ )
38
+
39
+ # filter with product string to allow non Badger'd sdwire devices to be detected
40
+ if product == constants.SDWIREC_PRODUCT_STRING:
41
+ device_list.append(
42
+ SDWireC(port_info=PortInfo(None, product, manufacturer, serial, device))
43
+ )
44
+
45
+ return device_list
46
+
47
+
48
+ def get_sdwire_devices() -> List[SDWire]:
49
+ ports = cpserial.data_comports()
50
+
51
+ # Badgerd SDWire Gen2
52
+ # VID = 0x1209 PID = 0x2404
53
+ # Badgerd SDWireC
54
+ # VID = 0x04e8 PID = 0x6001
55
+ result = []
56
+ for p in ports:
57
+ if p.vid == constants.SDWIRE_GEN2_VID and p.pid == constants.SDWIRE_GEN2_PID:
58
+ result.append(
59
+ SDWire(
60
+ port_info=PortInfo(
61
+ p.device, p.product, p.manufacturer, p.serial_number, p
62
+ )
63
+ )
64
+ )
65
+ # Search for legacy SDWireC devices
66
+ legacy_devices = get_sdwirec_devices()
67
+
68
+ return result + legacy_devices
@@ -0,0 +1,25 @@
1
+ from serial import Serial
2
+ from .usb_device import USBDevice, PortInfo
3
+
4
+
5
+ class SDWire(USBDevice):
6
+
7
+ def __init__(self, port_info: PortInfo):
8
+ super().__init__(port_info)
9
+
10
+ @property
11
+ def serial_string(self) -> str:
12
+ return "sdwire_gen2_101"
13
+
14
+ def invoke(self, command: str) -> None:
15
+ with Serial(self.dev_string) as channel:
16
+ channel.timeout = 0.05
17
+ data = command.encode() + b"\n"
18
+ print(f"data={data}")
19
+ channel.write(data)
20
+
21
+ def __str__(self):
22
+ return f"{self.serial_string}\t\t[{self.product_string}::{self.manufacturer_string}]"
23
+
24
+ def __repr__(self):
25
+ return self.__str__()
@@ -0,0 +1,40 @@
1
+ import logging
2
+ from pyftdi.ftdi import Ftdi
3
+ from serial import Serial
4
+ from .usb_device import USBDevice, PortInfo
5
+
6
+ log = logging.getLogger(__name__)
7
+
8
+
9
+ class SDWireC(USBDevice):
10
+
11
+ def __init__(self, port_info: PortInfo):
12
+ super().__init__(port_info)
13
+
14
+ def __str__(self):
15
+ return (
16
+ f"{self.serial_string}\t[{self.product_string}::{self.manufacturer_string}]"
17
+ )
18
+
19
+ def __repr__(self):
20
+ return self.__str__()
21
+
22
+ def switch_ts(self):
23
+ self._set_sdwire(1)
24
+
25
+ def switch_dut(self):
26
+ self._set_sdwire(0)
27
+
28
+ def _set_sdwire(self, target):
29
+ try:
30
+ ftdi = Ftdi()
31
+ ftdi.open_from_device(self.usb_device)
32
+ log.info(f"Set CBUS to 0x{0xF0 | target:02X}")
33
+ ftdi.set_bitmode(0xF0 | target, Ftdi.BitMode.CBUS)
34
+ ftdi.close()
35
+ except Exception as e:
36
+ import sys
37
+
38
+ log.debug("error while updating ftdi device", exc_info=1)
39
+ print("couldnt switch sdwire device")
40
+ sys.exit(1)
@@ -0,0 +1,33 @@
1
+ from collections import namedtuple
2
+ from serial.tools.list_ports_common import ListPortInfo
3
+
4
+ PortInfo = namedtuple(
5
+ "PortInfo", ("device", "product", "manufacturer", "serial", "usb_device")
6
+ )
7
+
8
+
9
+ class USBDevice:
10
+ __port_info = None
11
+
12
+ def __init__(self, port_info: PortInfo):
13
+ self.__port_info = port_info
14
+
15
+ @property
16
+ def usb_device(self):
17
+ return self.__port_info.usb_device
18
+
19
+ @property
20
+ def dev_string(self) -> str:
21
+ return self.__port_info.device
22
+
23
+ @property
24
+ def product_string(self) -> str:
25
+ return self.__port_info.product
26
+
27
+ @property
28
+ def manufacturer_string(self) -> str:
29
+ return self.__port_info.manufacturer
30
+
31
+ @property
32
+ def serial_string(self) -> str:
33
+ return self.__port_info.serial
@@ -0,0 +1,56 @@
1
+ import sys
2
+ import logging
3
+ import click
4
+ from .device.sdwire import SDWire
5
+ from .device.sdwirec import SDWireC
6
+ from . import detect
7
+
8
+ log = logging.getLogger(__name__)
9
+
10
+
11
+ def handle_switch_host_command(ctx):
12
+ device = ctx.obj["device"]
13
+ if isinstance(device, SDWireC):
14
+ device.switch_ts()
15
+
16
+
17
+ def handle_switch_target_command(ctx):
18
+ device = ctx.obj["device"]
19
+ if isinstance(device, SDWireC):
20
+ device.switch_dut()
21
+
22
+
23
+ def handle_switch_off_command(ctx):
24
+ device = ctx.obj["device"]
25
+ if isinstance(device, SDWireC):
26
+ log.info("SDWireC or legacy sdwire devices dont have off functionality")
27
+ print("SDWireC dont have off functionality")
28
+ sys.exit(1)
29
+
30
+
31
+ def handle_switch_command(ctx, serial):
32
+ devices = detect.get_sdwire_devices()
33
+
34
+ if serial is None:
35
+ # check the devices
36
+ if len(devices) == 0:
37
+ raise click.UsageError("There is no sdwire device connected!")
38
+ if len(devices) > 1:
39
+ raise click.UsageError(
40
+ "There is more then 1 sdwire device connected, please use --serial|-s to specify!"
41
+ )
42
+ log.info("1 sdwire/sdwirec device detected")
43
+ ctx.obj["device"] = devices[0]
44
+ else:
45
+ for device in devices:
46
+ if device.serial_string == serial:
47
+ ctx.obj["device"] = device
48
+ break
49
+ else:
50
+ raise click.UsageError(
51
+ f"There is no such sdwire device connected with serial={serial}"
52
+ )
53
+
54
+ device = ctx.obj["device"]
55
+ if isinstance(device, SDWire):
56
+ device.invoke(" ".join(sys.argv[1:]))
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env python
2
2
  import click
3
- from backend import utils
4
- from backend import detect
5
- from backend.device.sdwire import SDWire
3
+ from .backend import utils
4
+ from .backend import detect
5
+ from .backend.device.sdwire import SDWire
6
6
 
7
7
 
8
8
  @click.group()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sdwire
3
- Version: 0.1.1
3
+ Version: 0.2.0
4
4
  Summary: CLI application to interact with Badgerd SDWire Gen2 devices
5
5
  License: GPL-3
6
6
  Author: Talha Can Havadar
@@ -56,3 +56,45 @@ Commands:
56
56
  ts ts/host => connects the sdcard interface to host machine
57
57
  ```
58
58
 
59
+ ## Listing SDWire Devices
60
+
61
+ `sdwire list` command will search through usb devices connected to the system
62
+ and prints out the list of gen2 and legacy devices.
63
+
64
+ ```
65
+ ❯ sdwire list
66
+ Serial Product Info
67
+ sdwire_gen2_101 [SDWire-Gen2::Badgerd Technologies]
68
+ bdgrd_sdwirec_522 [sd-wire::SRPOL]
69
+ ```
70
+
71
+ ## Switching SD Card Connection
72
+
73
+ `sdwire switch` command switches the sd card connection to specified direction.
74
+ If there is more than one sdwire connected to then you need specify which sdwire
75
+ you want to alter with `--serial` or `-s` options.
76
+
77
+ If there is only one sdwire connected then you dont need to specify the serial,
78
+ it will pick the one connected automatically. See the examples below.
79
+
80
+ ```
81
+ ❯ sdwire list
82
+ Serial Product Info
83
+ sdwire_gen2_101 [SDWire-Gen2::Badgerd Technologies]
84
+ bdgrd_sdwirec_522 [sd-wire::SRPOL]
85
+
86
+ ❯ sdwire switch -s bdgrd_sdwirec_522 target
87
+
88
+ ❯ sdwire switch target
89
+ Usage: sdwire switch [OPTIONS] COMMAND [ARGS]...
90
+ Try 'sdwire switch --help' for help.
91
+
92
+ Error: There is more then 1 sdwire device connected, please use --serial|-s to specify!
93
+
94
+ ❯ sdwire list
95
+ Serial Product Info
96
+ bdgrd_sdwirec_522 [sd-wire::SRPOL]
97
+
98
+ ❯ sdwire switch host
99
+ ```
100
+
@@ -0,0 +1,14 @@
1
+ sdwire/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ sdwire/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ sdwire/backend/detect.py,sha256=3iSPiG0fLjxCp5sSJ6D4AO39P2wypHY4nApsJWYgCyI,2024
4
+ sdwire/backend/device/sdwire.py,sha256=Cl1WSWdH9Zr9D0bH5g7jz_rTqJiS5KVydJfV83GUEbg,675
5
+ sdwire/backend/device/sdwirec.py,sha256=BZXvCq3bmJzzA5seCVOYIdmr6FBeAreE95_n-2kiuMQ,1035
6
+ sdwire/backend/device/usb_device.py,sha256=6Mt24B22yTD4RdY24LgnRaVtbX60EPE2SAK-pN0ZESc,775
7
+ sdwire/backend/utils.py,sha256=ruOZJTPVtTKaQOLP-FylHAb67ygoCJ-o2ug8XjQUr44,1615
8
+ sdwire/constants.py,sha256=Ip2d7ow5Nj0nO0OyHeiXuGJJcK33BGmTspLtNEduFAo,127
9
+ sdwire/main.py,sha256=ndbRoCkSckItLDH0q3zacC0mqfa0ZL-TJGDkIGJKrBU,2138
10
+ sdwire-0.2.0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
11
+ sdwire-0.2.0.dist-info/METADATA,sha256=R1n5WrLSXVDYUTMyhuTrNnIZL71CP8EsYMtUrDEG6nQ,3010
12
+ sdwire-0.2.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
13
+ sdwire-0.2.0.dist-info/entry_points.txt,sha256=pxy0zJKVcNWXPk5PtNjTLExOBpqFNth37wtdYdYRXCE,43
14
+ sdwire-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ sdwire=sdwire:main.main
3
+
__init__.py DELETED
@@ -1 +0,0 @@
1
- print(__file__)
@@ -1,8 +0,0 @@
1
- __init__.py,sha256=F67sqTglxRRS7eDtAnZ4JXt3DqT0l7tEvUMbM75n-Dg,16
2
- constants.py,sha256=Ip2d7ow5Nj0nO0OyHeiXuGJJcK33BGmTspLtNEduFAo,127
3
- main.py,sha256=adVUleGCnEEQp2MakaD1t3muaevxH8W74rpJGxuX98o,2135
4
- sdwire-0.1.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
5
- sdwire-0.1.1.dist-info/METADATA,sha256=8Pd6_omUvK9txgweNZsgVwVl2CJ6zArCaArsrOega6o,1839
6
- sdwire-0.1.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
7
- sdwire-0.1.1.dist-info/entry_points.txt,sha256=OCGskaVs56CWHqKFr0_vFxqMv039fWVeAizS8-TTcZ0,36
8
- sdwire-0.1.1.dist-info/RECORD,,
@@ -1,3 +0,0 @@
1
- [console_scripts]
2
- sdwire=main:main
3
-
File without changes
File without changes