From 68e0c97cbfd7636bfaf14ce80bb8fa389d8e5cb6 Mon Sep 17 00:00:00 2001 From: Marek Ventur Date: Tue, 21 Aug 2018 20:58:57 +0100 Subject: [PATCH] Keep resources.py in sync with backend --- .development/resources.py | 3 +- adhoc.py | 8 +++++ lib/speaker.py | 70 +++++++++++++++++++++++++++++++++++++++ lib/test_buttons.py | 20 +++++++++++ lib/test_speaker.py | 34 +++++++++++++++++++ lib/ugfx_helper.py | 13 ++++++++ 6 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 adhoc.py create mode 100644 lib/speaker.py create mode 100644 lib/test_buttons.py create mode 100644 lib/test_speaker.py create mode 100644 lib/ugfx_helper.py diff --git a/.development/resources.py b/.development/resources.py index 61284ef..31dd9bc 100644 --- a/.development/resources.py +++ b/.development/resources.py @@ -87,9 +87,10 @@ def get_resources(path): if upip_lib.startswith(".") or upip_lib == "__pycache__": continue full_lib_path = os.path.join(full_path, upip_lib) + rel_lib_path = os.path.join(sub_path, upip_lib) files = {} if os.path.isfile(full_lib_path): - files = {full_lib_path: None} + files = {rel_lib_path: None} upip_lib = upip_lib.rsplit('.', 1)[0] else: for rel_path in _scan_files(full_lib_path, os.path.join(sub_path, upip_lib)): diff --git a/adhoc.py b/adhoc.py new file mode 100644 index 0000000..5dfadd2 --- /dev/null +++ b/adhoc.py @@ -0,0 +1,8 @@ +# Fancy a quick experiment? No problem, just code it in here and run +# "./tilda_tools run adhoc.py" + +import ugfx, ugfx_helper, dialogs + +ugfx_helper.init() +ugfx.clear() + diff --git a/lib/speaker.py b/lib/speaker.py new file mode 100644 index 0000000..360a388 --- /dev/null +++ b/lib/speaker.py @@ -0,0 +1,70 @@ +"""Library for speaker related functions""" + +from machine import Pin, PWM +from math import log, pow +from time import sleep_ms + +_enabled = True +_amp_pin = Pin(Pin.GPIO_AMP_SHUTDOWN) +_speaker_pwm = None + +def enabled(value=None): + """Sets the internal amplifier. This is entirely independent from the PWM""" + global _enabled + if value == None: + return _enabled + else: + _enabled = value + _set_amp() + +def _set_amp(): + if enabled(): + _amp_pin.on() + else: + _amp_pin.off() + +def speaker_pwm(): + global _speaker_pwm + if not _speaker_pwm: + _speaker_pwm = PWM(PWM.PWM_SPEAKER) + return _speaker_pwm + +_frequency = None +def frequency(value = None): + global _frequency + if value == None: + return _frequency + _frequency = value + _set_amp() + speaker_pwm().init(duty=50, freq=_frequency) + +def stop(): + global _frequency + # todo: maybe we should deinit the PWM? + _frequency = None + speaker_pwm().duty(0) + +# Music +NOTES = {"C":0, "C#":1, "D":2, "D#":3, "E":4, "F":5, "F#":6, "G":7, "G#":8, "A":9, "A#":10, "B":11} + +def note_to_frequency(note): + if (len(note) == 2) and note[1].isdigit(): + octave = int(note[1]) + note = note[0].upper() + elif len(note) == 3: + octave = int(note[2]) + note = note[0:2].upper() + else: + octave = 4 + note = note.upper() + + if note not in NOTES: + raise Exception("%s it not a valid note" % note) + + halftones = NOTES[note] + 12 * (octave - 4) + freq = 440 * pow(1.059, halftones) + return round(freq) + +def note(note): + frequency(note_to_frequency(note)) + diff --git a/lib/test_buttons.py b/lib/test_buttons.py new file mode 100644 index 0000000..e54c910 --- /dev/null +++ b/lib/test_buttons.py @@ -0,0 +1,20 @@ +"""Tests for icons lib""" + +___license___ = "MIT" +___dependencies___ = ["upip:unittest", "buttons"] + +import unittest, ugfx, time +from buttons import * + +class TestButtons(unittest.TestCase): + + def test_is_pressed(self): + self.assertFalse(is_pressed(Buttons.BTN_9)) + + def test_is_triggered(self): + self.assertFalse(is_triggered(Buttons.BTN_9)) + + + +if __name__ == '__main__': + unittest.main() diff --git a/lib/test_speaker.py b/lib/test_speaker.py new file mode 100644 index 0000000..d42ae0c --- /dev/null +++ b/lib/test_speaker.py @@ -0,0 +1,34 @@ +"""Tests for http""" + +___license___ = "MIT" +___dependencies___ = ["upip:unittest", "speaker", "sleep"] + +import unittest, speaker +from sleep import * + +class TestSpeaker(unittest.TestCase): + + def tearDown(self): + speaker.stop() + + def test_enabled(self): + self.assertEqual(speaker.enabled(), True) + speaker.enabled(False) + self.assertEqual(speaker.enabled(), False) + speaker.enabled(True) + self.assertEqual(speaker.enabled(), True) + + def test_beep_and_stop(self): + for f in range(50, 1000): + speaker.frequency(f) + self.assertEqual(speaker.frequency(), f) + sleep_ms(1) + speaker.stop() + + def test_note(self): + for n in ["c", "d", "e", "f", "g", "a", "b", "c5"]: + speaker.note(n) + sleep_ms(100) + +if __name__ == '__main__': + unittest.main() diff --git a/lib/ugfx_helper.py b/lib/ugfx_helper.py new file mode 100644 index 0000000..9c3ce20 --- /dev/null +++ b/lib/ugfx_helper.py @@ -0,0 +1,13 @@ +"""Helper library for ugfx stuff""" + +___license___ = "MIT" + +import ugfx +from machine import Pin + +def init(): + ugfx.init() + Pin(Pin.PWM_LCD_BLIGHT).on() + +def deinit(): + Pin(Pin.PWM_LCD_BLIGHT).off()