Coverage for d7a/system_files/factory_settings.py: 38%
102 statements
« prev ^ index » next coverage.py v7.5.0, created at 2024-05-24 08:03 +0200
« prev ^ index » next coverage.py v7.5.0, created at 2024-05-24 08:03 +0200
1#
2# Copyright (c) 2015-2021 University of Antwerp, Aloxy NV.
3#
4# This file is part of pyd7a.
5# See https://github.com/Sub-IoT/pyd7a for further info.
6#
7# Licensed under the Apache License, Version 2.0 (the "License");
8# you may not use this file except in compliance with the License.
9# You may obtain a copy of the License at
10#
11# http://www.apache.org/licenses/LICENSE-2.0
12#
13# Unless required by applicable law or agreed to in writing, software
14# distributed under the License is distributed on an "AS IS" BASIS,
15# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16# See the License for the specific language governing permissions and
17# limitations under the License.
18#
19import struct
21from d7a.support.schema import Validatable, Types
22from d7a.system_files.file import File
23from d7a.system_files.system_file_ids import SystemFileIds
25from math import log, ceil
27class FactorySettingsFile(File, Validatable):
29 SCHEMA = [{
30 "gain": Types.INTEGER(min=-128, max=127),
31 "rx_bw_low_rate": Types.INTEGER(min=0, max=0xFFFFFFFF),
32 "rx_bw_normal_rate": Types.INTEGER(min=0, max=0xFFFFFFFF),
33 "rx_bw_high_rate": Types.INTEGER(min=0, max=0xFFFFFFFF),
34 "bitrate_lo_rate": Types.INTEGER(min=0, max=0xFFFFFFFF),
35 "fdev_lo_rate": Types.INTEGER(min=0, max=0xFFFFFFFF),
36 "bitrate_normal_rate": Types.INTEGER(min=0, max=0xFFFFFFFF),
37 "fdev_normal_rate": Types.INTEGER(min=0, max=0xFFFFFFFF),
38 "bitrate_hi_rate": Types.INTEGER(min=0, max=0xFFFFFFFF),
39 "fdev_hi_rate": Types.INTEGER(min=0, max=0xFFFFFFFF),
40 "preamble_size_lo_rate": Types.INTEGER(min=0, max=255),
41 "preamble_size_normal_rate": Types.INTEGER(min=0, max=255),
42 "preamble_size_hi_rate": Types.INTEGER(min=0, max=255),
43 "preamble_detector_size_lo_rate": Types.INTEGER(min=0, max=255),
44 "preamble_detector_size_normal_rate": Types.INTEGER(min=0, max=255),
45 "preamble_detector_size_hi_rate": Types.INTEGER(min=0, max=255),
46 "preamble_tol": Types.INTEGER(min=0, max=255),
47 "rssi_smoothing": Types.INTEGER(min=0, max=255),
48 "rssi_offset": Types.INTEGER(min=-126, max=125),
49 "lora_bw": Types.INTEGER(min=0, max=0xFFFFFFFF),
50 "lora_SF": Types.INTEGER(min=6, max=12),
51 "gaussian" : Types.INTEGER(min=0, max=3),
52 "paramp" : Types.INTEGER(min=0, max=0xFFFF)
53 }]
55 def __init__(self, gain=0, rx_bw_low_rate=10468, rx_bw_normal_rate=78646, rx_bw_high_rate=125868,
56 bitrate_lo_rate=9600, fdev_lo_rate=4800,
57 bitrate_normal_rate=55555, fdev_normal_rate=50000, bitrate_hi_rate=166667, fdev_hi_rate=41667,
58 preamble_size_lo_rate=5, preamble_size_normal_rate=5, preamble_size_hi_rate=7,
59 preamble_detector_size_lo_rate=3, preamble_detector_size_normal_rate=3, preamble_detector_size_hi_rate=3,
60 preamble_tol_lo_rate=15, preamble_tol_normal_rate=10, preamble_tol_hi_rate=10,
61 rssi_smoothing=8, rssi_offset=0,
62 lora_bw=125000, lora_SF=9,
63 gaussian=2, paramp=40):
64 self.gain = gain
65 self.rx_bw_low_rate = rx_bw_low_rate
66 self.rx_bw_normal_rate = rx_bw_normal_rate
67 self.rx_bw_high_rate = rx_bw_high_rate
68 self.bitrate_lo_rate = bitrate_lo_rate
69 self.fdev_lo_rate = fdev_lo_rate
70 self.bitrate_normal_rate = bitrate_normal_rate
71 self.fdev_normal_rate = fdev_normal_rate
72 self.bitrate_hi_rate = bitrate_hi_rate
73 self.fdev_hi_rate = fdev_hi_rate
74 self.preamble_size_lo_rate = preamble_size_lo_rate
75 self.preamble_size_normal_rate = preamble_size_normal_rate
76 self.preamble_size_hi_rate = preamble_size_hi_rate
77 self.preamble_detector_size_lo_rate = preamble_detector_size_lo_rate
78 self.preamble_detector_size_normal_rate = preamble_detector_size_normal_rate
79 self.preamble_detector_size_hi_rate = preamble_detector_size_hi_rate
80 self.preamble_tol_lo_rate = preamble_tol_lo_rate
81 self.preamble_tol_normal_rate = preamble_tol_normal_rate
82 self.preamble_tol_hi_rate = preamble_tol_hi_rate
83 self.rssi_smoothing = int(ceil(log(rssi_smoothing, 2)))-1
84 self.rssi_offset = rssi_offset
85 self.lora_bw = lora_bw
86 self.lora_SF = lora_SF
87 self.gaussian = gaussian
88 self.paramp = paramp
89 File.__init__(self, SystemFileIds.FACTORY_SETTINGS.value, 56)
90 Validatable.__init__(self)
92 @staticmethod
93 def parse(s, offset=0, length=56):
94 gain = s.read("int:8")
95 rx_bw_low_rate = s.read("uint:32")
96 rx_bw_normal_rate = s.read("uint:32")
97 rx_bw_high_rate = s.read("uint:32")
98 bitrate_lo_rate = s.read("uint:32")
99 fdev_lo_rate = s.read("uint:32")
100 bitrate_normal_rate = s.read("uint:32")
101 fdev_normal_rate = s.read("uint:32")
102 bitrate_hi_rate = s.read("uint:32")
103 fdev_hi_rate = s.read("uint:32")
105 preamble_size_lo_rate = s.read("uint:8")
106 preamble_size_normal_rate = s.read("uint:8")
107 preamble_size_hi_rate = s.read("uint:8")
109 preamble_detector_size_lo_rate = s.read("uint:8")
110 preamble_detector_size_normal_rate = s.read("uint:8")
111 preamble_detector_size_hi_rate = s.read("uint:8")
112 preamble_tol_lo_rate = s.read("uint:8")
113 preamble_tol_normal_rate = s.read("uint:8")
114 preamble_tol_hi_rate = s.read("uint:8")
116 rssi_smoothing = s.read("uint:8")
117 rssi_offset = s.read("uint:8")
119 lora_bw = s.read("uint:32")
120 lora_SF = s.read("uint:8")
122 gaussian = s.read("uint:8")
123 paramp = s.read("uint:16")
125 return FactorySettingsFile(gain=gain, rx_bw_low_rate=rx_bw_low_rate, rx_bw_normal_rate=rx_bw_normal_rate, rx_bw_high_rate=rx_bw_high_rate,
126 bitrate_lo_rate=bitrate_lo_rate, fdev_lo_rate=fdev_lo_rate,
127 bitrate_normal_rate=bitrate_normal_rate, fdev_normal_rate=fdev_normal_rate,
128 bitrate_hi_rate=bitrate_hi_rate, fdev_hi_rate=fdev_hi_rate,
129 preamble_size_lo_rate=preamble_size_lo_rate, preamble_size_normal_rate=preamble_size_normal_rate,
130 preamble_size_hi_rate=preamble_size_hi_rate, preamble_detector_size_lo_rate = preamble_detector_size_lo_rate,
131 preamble_detector_size_normal_rate=preamble_detector_size_normal_rate, preamble_detector_size_hi_rate = preamble_detector_size_hi_rate,
132 preamble_tol_lo_rate = preamble_tol_lo_rate, preamble_tol_normal_rate = preamble_tol_normal_rate,
133 preamble_tol_hi_rate = preamble_tol_hi_rate,
134 rssi_smoothing=rssi_smoothing, rssi_offset=rssi_offset,
135 lora_bw=lora_bw, lora_SF=lora_SF,
136 gaussian=gaussian, paramp=paramp)
138 def __iter__(self):
139 yield self.gain
140 for byte in bytearray(struct.pack(">I", self.rx_bw_low_rate)):
141 yield byte
142 for byte in bytearray(struct.pack(">I", self.rx_bw_normal_rate)):
143 yield byte
144 for byte in bytearray(struct.pack(">I", self.rx_bw_high_rate)):
145 yield byte
146 for byte in bytearray(struct.pack(">I", self.bitrate_lo_rate)):
147 yield byte
148 for byte in bytearray(struct.pack(">I", self.fdev_lo_rate)):
149 yield byte
150 for byte in bytearray(struct.pack(">I", self.bitrate_normal_rate)):
151 yield byte
152 for byte in bytearray(struct.pack(">I", self.fdev_normal_rate)):
153 yield byte
154 for byte in bytearray(struct.pack(">I", self.bitrate_hi_rate)):
155 yield byte
156 for byte in bytearray(struct.pack(">I", self.fdev_hi_rate)):
157 yield byte
158 yield self.preamble_size_lo_rate
159 yield self.preamble_size_normal_rate
160 yield self.preamble_size_hi_rate
161 yield self.preamble_detector_size_lo_rate
162 yield self.preamble_detector_size_normal_rate
163 yield self.preamble_detector_size_hi_rate
164 yield self.preamble_tol_lo_rate
165 yield self.preamble_tol_normal_rate
166 yield self.preamble_tol_hi_rate
167 yield self.rssi_smoothing
168 yield self.rssi_offset
169 for byte in bytearray(struct.pack(">I", self.lora_bw)):
170 yield byte
171 yield self.lora_SF
172 yield self.gaussian
173 for byte in bytearray(struct.pack(">H", self.paramp)):
174 yield byte
176 def __str__(self):
177 return "gain={}, rx_bw_low_rate={}, rx_bw_normal_rate={}, rx_bw_high_rate={}, low rate={} : {}, normal rate={} : {}, high rate={} : {}, preamble sizes {} : {} : {}, preamble detector size {} : {} : {} with tol {} : {} : {}, rssi smoothing {} with offset {}\nlora sf set to {}, bw to {}\ngaussian set to {} and paramp to {} microseconds".format(self.gain, self.rx_bw_low_rate, self.rx_bw_normal_rate, self.rx_bw_high_rate,
178 self.bitrate_lo_rate, self.fdev_lo_rate,
179 self.bitrate_normal_rate, self.fdev_normal_rate, self.bitrate_hi_rate, self.fdev_hi_rate,
180 self.preamble_size_lo_rate, self.preamble_size_normal_rate, self.preamble_size_hi_rate,
181 self.preamble_detector_size_lo_rate, self.preamble_detector_size_normal_rate, self.preamble_detector_size_hi_rate,
182 self.preamble_tol_lo_rate, self.preamble_tol_normal_rate, self.preamble_tol_hi_rate,
183 self.rssi_smoothing, self.rssi_offset,
184 self.lora_bw, self.lora_SF,
185 self.gaussian, self.paramp)