[chirp_devel] [PATCH 1 of 3] FIXME: radio settings
Dan Smith
Fri Apr 6 12:12:49 PDT 2012
# HG changeset patch
# User Dan Smith <dsmith at danplanet.com>
# Date 1333739555 25200
# Node ID 21a443c222d1cfdb043b07f858a7b58d5fcc26d6
# Parent 0f5732297a9aabd5dc2e7cb603e0e8f6def94195
FIXME: radio settings
Bug #00
diff -r 0f5732297a9a -r 21a443c222d1 chirp/chirp_common.py
--- a/chirp/chirp_common.py Fri Apr 06 10:39:28 2012 -0700
+++ b/chirp/chirp_common.py Fri Apr 06 12:12:35 2012 -0700
@@ -778,6 +778,12 @@
def get_features(self):
return RadioFeatures()
+ def get_settings(self):
+ return None
+
+ def set_settings(self, settings):
+ raise Exception("Not implemented")
+
def _get_name_raw(*args):
cls = args[-1]
return "%s %s" % (cls.VENDOR, cls.MODEL)
diff -r 0f5732297a9a -r 21a443c222d1 chirp/settings.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/chirp/settings.py Fri Apr 06 12:12:35 2012 -0700
@@ -0,0 +1,176 @@
+# Copyright 2012 Dan Smith <dsmith at danplanet.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from chirp import chirp_common
+
+class InvalidValueError(Exception):
+ pass
+
+class InternalError(Exception):
+ pass
+
+class RadioSettingValue:
+ def __init__(self):
+ self.set_value(None)
+
+ def set_value(self, value):
+ raise Exception("Unimplemented")
+
+ def get_value(self):
+ return self._current
+
+ def __trunc__(self):
+ return int(self.get_value())
+
+ def __str__(self):
+ return str(self.get_value())
+
+class RadioSettingValueInteger(RadioSettingValue):
+ def __init__(self, min, max, current, step=1):
+ self._min = min
+ self._max = max
+ self._step = step
+ self.set_value(current)
+
+ def set_value(self, value):
+ try:
+ value = int(value)
+ except:
+ raise InvalidValueError("An integer is required")
+ if value > self._max or value < self._min:
+ raise InvalidValueError("Value %i not in range %i-%i" % (value,
+ self._min,
+ self._max))
+ self._current = value
+
+ def get_min(self):
+ return self._min
+
+ def get_max(self):
+ return self._max
+
+ def get_step(self):
+ return self._step
+
+class RadioSettingValueBoolean(RadioSettingValue):
+ def __init__(self, current):
+ self.set_value(current)
+
+ def set_value(self, value):
+ self._current = bool(value)
+
+ def __str__(self):
+ return str(bool(self.get_value()))
+
+class RadioSettingValueList(RadioSettingValue):
+ def __init__(self, options, current):
+ self._options = options
+ self.set_value(current)
+
+ def set_value(self, value):
+ if not value in self._options:
+ raise InvalidValueError("%s is not valid for this setting" % value)
+ self._current = value
+
+ def get_options(self):
+ return self._options
+
+ def __trunc__(self):
+ return self._options.index(self._current)
+
+class RadioSettingValueString(RadioSettingValue):
+ def __init__(self, minlength, maxlength, current,
+ autopad=True):
+ self._minlength = minlength
+ self._maxlength = maxlength
+ self._charset = chirp_common.CHARSET_ASCII
+ self._autopad = autopad
+ self._autostrip = autostrip
+ self.set_value(current)
+
+ def set_charset(self, charset):
+ self._charset = charset
+
+ def set_value(self, value):
+ if len(value) < self._minlength or len(value) > self._maxlength:
+ raise InvalidValueError("Value must be between %i and %i chars" % (\
+ self._minlength, self._maxlength))
+ if self._autopad:
+ value = value.ljust(self._maxlength)
+ for char in value:
+ if char not in self._charset:
+ raise InvalidValueError("Value contains invalid " +
+ "character `%s'" % char)
+ self._current = value
+
+ def __str__(self):
+ return self._current.rstrip()
+
+class RadioSettingGroup:
+ def __init__(self, name, shortname):
+ self._name = name # Setting identifier
+ self._shortname = shortname # Short human-readable name/description
+ self.__doc__ = name # Longer explanation/documentation
+ self._elements = {}
+ self._element_order = []
+
+ def get_name(self):
+ return self._name
+
+ def get_shortname(self):
+ return self._shortname
+
+ def add_element(self, element):
+ self._elements[element.get_name()] = element
+ self._element_order.append(element.get_name())
+
+ def get_element(self, name):
+ return self._elements[name]
+
+ def get_elements(self):
+ return [self._elements[name] for name in self._element_order]
+
+ def get_element_names(self):
+ return self._elemetn_order
+
+ def set_doc(self, doc):
+ self.__doc__ = doc
+
+ def __str__(self):
+ s = "{Settings Group %s:\n" % self._name
+ for element in self._elements.values():
+ s += "%s: %s\n" % (element.get_name(), element.get_value())
+ s += "}"
+ return s
+
+class RadioSetting(RadioSettingGroup):
+ def __init__(self, name, value):
+ self._name = name
+ self._value = value
+
+ if not isinstance(value, RadioSettingValue):
+ raise InternalError("Incorrect type")
+
+ def set_value(self, value):
+ self._value.set_value(value)
+
+ def get_value(self):
+ return self._value
+
+ def __str__(self):
+ return str(self._value)
+
+ def __repr__(self):
+ return "[RadioSetting %s:%s]" % (self._name, self._value)
More information about the chirp_devel
mailing list