Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add dead zone to knobs #212

Merged
merged 26 commits into from Jan 20, 2023
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
026463c
Add deadzone to AnalogReader class
redoxcode Dec 22, 2022
51e6935
Fixed missing self.
redoxcode Dec 22, 2022
e72a048
Moved deadzone code to Knob class
redoxcode Dec 22, 2022
2c2096f
deadzone again in AnalogueReader, improved _sample_adc
redoxcode Dec 23, 2022
fc44bb1
fix formating
redoxcode Dec 23, 2022
b1ac39c
activate deadzones for knobs
redoxcode Dec 23, 2022
c664dc4
update test to account for deadzones of 0.01
redoxcode Dec 23, 2022
133cb3d
update to account for deadzones of 0.01
redoxcode Dec 23, 2022
837ff90
Fixed formating
redoxcode Dec 26, 2022
c352735
deadzone usage closer to sample size usage
redoxcode Jan 5, 2023
1eb4e19
fix unindent bug
redoxcode Jan 5, 2023
49339a8
Fix formating
redoxcode Jan 5, 2023
77f8ece
fixed bug in knob init
redoxcode Jan 5, 2023
bc44a55
Add documentation
redoxcode Jan 5, 2023
b2e7684
fix formatting
redoxcode Jan 5, 2023
0a57fd0
Test with and without deadzone
redoxcode Jan 5, 2023
3fd12e3
fixed wrong deadzone for one test case
redoxcode Jan 5, 2023
5ceacb5
Add tests with and without deadzone
redoxcode Jan 5, 2023
8180e91
fixed bug when trying to overwrite deadzone with 0.0
redoxcode Jan 5, 2023
7790804
Merge branch 'Allen-Synthesis:main' into add-dead-zone-to-knobs
redoxcode Jan 5, 2023
b7b39c7
Add deadzone parameter to Knob read_position()
redoxcode Jan 9, 2023
666cf26
test for read_position with and without deadzones
redoxcode Jan 19, 2023
7005e2e
test read_position with and without deadzones
redoxcode Jan 19, 2023
6a275a1
Fix wrong deadzone value
redoxcode Jan 19, 2023
fd6cb70
Fix wrong expected value
redoxcode Jan 19, 2023
c94ccbd
Fix another wrong expected value
redoxcode Jan 19, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 10 additions & 7 deletions software/firmware/europi.py
Expand Up @@ -128,17 +128,18 @@ class AnalogueReader:
not need to be used by user scripts.
"""

def __init__(self, pin, samples=DEFAULT_SAMPLES):
def __init__(self, pin, samples=DEFAULT_SAMPLES, deadzone=0.0):
redoxcode marked this conversation as resolved.
Show resolved Hide resolved
self.pin_id = pin
self.pin = ADC(Pin(pin))
self.set_samples(samples)
self.deadzone = deadzone

def _sample_adc(self, samples=None):
# Over-samples the ADC and returns the average.
values = []
value = 0
for _ in range(samples or self._samples):
values.append(self.pin.read_u16())
return round(sum(values) / len(values))
value += self.pin.read_u16()
return round(value / (samples or self._samples))

def set_samples(self, samples):
"""Override the default number of sample reads with the given value."""
Expand All @@ -148,7 +149,9 @@ def set_samples(self, samples):

def percent(self, samples=None):
"""Return the percentage of the component's current relative range."""
return self._sample_adc(samples) / MAX_UINT16
value = self._sample_adc(samples) / MAX_UINT16
value = value * (1.0 + 2.0 * self.deadzone) - self.deadzone
return max(0.0, min(1.0, value))
redoxcode marked this conversation as resolved.
Show resolved Hide resolved

def range(self, steps=100, samples=None):
"""Return a value (upper bound excluded) chosen by the current voltage value."""
Expand Down Expand Up @@ -255,12 +258,12 @@ def clock_division(self):
"""

def __init__(self, pin):
super().__init__(pin)
super().__init__(pin, deadzone=0.01)
redoxcode marked this conversation as resolved.
Show resolved Hide resolved

def percent(self, samples=None):
"""Return the knob's position as relative percentage."""
# Reverse range to provide increasing range.
return 1 - (self._sample_adc(samples) / MAX_UINT16)
return 1.0 - super().percent(samples)

def read_position(self, steps=100, samples=None):
redoxcode marked this conversation as resolved.
Show resolved Hide resolved
"""Returns the position as a value between zero and provided integer."""
Expand Down
4 changes: 2 additions & 2 deletions software/tests/experimental/test_knobs.py
Expand Up @@ -258,9 +258,9 @@ def test_access_by_index(mockHardware: MockHardware, knob_bank: KnobBank):
mockHardware.set_ADC_u16_value(knob_bank.current, MAX_UINT16 / 5)

assert round(knob_bank.knobs[0].percent(), 2) == 0
assert round(knob_bank.knobs[1].percent(), 2) == 0.80
assert round(knob_bank.knobs[1].percent(), 2) == 0.81
redoxcode marked this conversation as resolved.
Show resolved Hide resolved
assert round(knob_bank.knobs[2].percent(), 2) == 0.67
assert round(knob_bank.current.percent(), 2) == 0.80
assert round(knob_bank.current.percent(), 2) == 0.81


# KnobBank.Builder tests
Expand Down
12 changes: 6 additions & 6 deletions software/tests/test_knob.py
Expand Up @@ -9,8 +9,8 @@
"value, expected",
[
(1, 1.0000),
(0.75, 0.7500),
(0.66, 0.6600),
(0.75, 0.7550),
(0.66, 0.6632),
(0.5, 0.5000),
(0, 0.0000),
],
Expand All @@ -25,8 +25,8 @@ def test_set_knob_percent(mockHardware: MockHardware, value, expected):
"value, expected",
[
(0, 1.0000),
(MAX_UINT16 / 4, 0.7500),
(MAX_UINT16 / 3, 0.6667),
(MAX_UINT16 / 4, 0.7550),
(MAX_UINT16 / 3, 0.6700),
(MAX_UINT16 / 2, 0.5000),
(MAX_UINT16, 0.0000),
],
Expand All @@ -41,8 +41,8 @@ def test_percent(mockHardware: MockHardware, value, expected):
"value, expected",
[
(0, 99),
(MAX_UINT16 / 4, 74),
(MAX_UINT16 / 3, 66),
(MAX_UINT16 / 4, 75),
(MAX_UINT16 / 3, 67),
(MAX_UINT16 / 2, 49),
(MAX_UINT16, 0),
],
Expand Down