Skip to content

Commit e27cdd0

Browse files
maciejbaczmanskipjasinski990Przemyslaw Bida
committed
[tools] add missing tcat ble client files
Some files were missing during repo migration, this commit adds them. Co-authored-by: Piotr Jasinski <piotr.jasinski990@gmail.com> Co-authored-by: Przemyslaw Bida <przemyslaw.bida@nordicsemi.no> Signed-off-by: Maciej Baczmanski <maciej.baczmanski@nordicsemi.no>
1 parent 49c59ec commit e27cdd0

File tree

2 files changed

+132
-0
lines changed

2 files changed

+132
-0
lines changed

tools/tcat_ble_client/tlv/tlv.py

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
"""
2+
Copyright (c) 2024, The OpenThread Authors.
3+
All rights reserved.
4+
5+
Redistribution and use in source and binary forms, with or without
6+
modification, are permitted provided that the following conditions are met:
7+
1. Redistributions of source code must retain the above copyright
8+
notice, this list of conditions and the following disclaimer.
9+
2. Redistributions in binary form must reproduce the above copyright
10+
notice, this list of conditions and the following disclaimer in the
11+
documentation and/or other materials provided with the distribution.
12+
3. Neither the name of the copyright holder nor the
13+
names of its contributors may be used to endorse or promote products
14+
derived from this software without specific prior written permission.
15+
16+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26+
POSSIBILITY OF SUCH DAMAGE.
27+
"""
28+
29+
from __future__ import annotations
30+
from typing import List
31+
32+
33+
class TLV():
34+
def __init__(self, type: int = None, value: bytes = None):
35+
self.type: int = type
36+
self.value: bytes = value
37+
38+
def __str__(self):
39+
return f'TLV\n\tTYPE:\t0x{self.type:02x}\n\tVALUE:\t{self.value}'
40+
41+
@staticmethod
42+
def parse_tlvs(data: bytes) -> List[TLV]:
43+
res: List[TLV] = []
44+
while data:
45+
next_tlv = TLV.from_bytes(data)
46+
next_tlv_size = len(next_tlv.to_bytes())
47+
data = data[next_tlv_size:]
48+
res.append(next_tlv)
49+
return res
50+
51+
@staticmethod
52+
def from_bytes(data: bytes) -> TLV:
53+
res = TLV()
54+
res.set_from_bytes(data)
55+
return res
56+
57+
def set_from_bytes(self, data: bytes):
58+
self.type = data[0]
59+
header_len = 2
60+
if data[1] == 0xFF:
61+
header_len = 4
62+
length = int.from_bytes(data[1:header_len], byteorder='big')
63+
self.value = data[header_len:header_len + length]
64+
65+
def to_bytes(self) -> bytes:
66+
has_long_header = len(self.value) >= 255
67+
header_len = 4 if has_long_header else 2
68+
len_bytes = len(self.value).to_bytes(header_len - 1, byteorder='big')
69+
header = bytes([self.type]) + len_bytes
70+
return header + self.value
+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
"""
2+
Copyright (c) 2024, The OpenThread Authors.
3+
All rights reserved.
4+
5+
Redistribution and use in source and binary forms, with or without
6+
modification, are permitted provided that the following conditions are met:
7+
1. Redistributions of source code must retain the above copyright
8+
notice, this list of conditions and the following disclaimer.
9+
2. Redistributions in binary form must reproduce the above copyright
10+
notice, this list of conditions and the following disclaimer in the
11+
documentation and/or other materials provided with the distribution.
12+
3. Neither the name of the copyright holder nor the
13+
names of its contributors may be used to endorse or promote products
14+
derived from this software without specific prior written permission.
15+
16+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26+
POSSIBILITY OF SUCH DAMAGE.
27+
"""
28+
29+
def get_int_in_range(min_value, max_value):
30+
while True:
31+
try:
32+
user_input = int(input('> '))
33+
if min_value <= user_input <= max_value:
34+
return user_input
35+
else:
36+
print('The value is out of range. Try again.')
37+
except ValueError:
38+
print('The value is not an integer. Try again.')
39+
except KeyboardInterrupt:
40+
quit_with_reason('Program interrupted by user. Quitting.')
41+
42+
43+
def quit_with_reason(reason):
44+
print(reason)
45+
exit(1)
46+
47+
48+
def select_device_by_user_input(tcat_devices):
49+
if tcat_devices:
50+
print('Found devices:\n')
51+
for i, device in enumerate(tcat_devices):
52+
print(f'{i + 1}: {device.name} - {device.address}')
53+
else:
54+
print('\nNo devices found.')
55+
return None
56+
57+
print('\nSelect the target number to connect to it.')
58+
selected = get_int_in_range(1, len(tcat_devices))
59+
device = tcat_devices[selected - 1]
60+
print('Selected ', device)
61+
62+
return device

0 commit comments

Comments
 (0)