diff options
author | Walter Bender <walter.bender@gmail.com> | 2012-12-26 15:49:58 (GMT) |
---|---|---|
committer | Walter Bender <walter.bender@gmail.com> | 2012-12-26 15:49:58 (GMT) |
commit | e04160e69b4ec6f955802fcf895852c786ba86b6 (patch) | |
tree | e4a49dd64274dc2bea4d8bebe2ab0cc9488e3d25 | |
parent | d36a2809a6574d62ef4f52e860754e139f3c1c02 (diff) |
add xo4 support
-rw-r--r-- | NEWS | 21 | ||||
-rwxr-xr-x | activity/activity.info | 2 | ||||
-rw-r--r-- | audiograb.py | 21 | ||||
-rw-r--r-- | config.py | 1 | ||||
-rw-r--r-- | measure.py | 59 |
5 files changed, 82 insertions, 22 deletions
@@ -1,3 +1,24 @@ +45 + +ENHANCEMENTS: +* OLPC XO 4 support + +BUG FIX: + + +44 + +BUG FIXES: +* Work around recent changes to numpy library that caused FFT to stop working +* Forcing XO 1.75, 3.0, and 4.0 to single channel + (until such time as multi-channel capture works reliably) +* Fix problem with mic boost on 1.75 (#4288) + +43 + +ENHANCEMENTS: +* New translations + 42 ENHANCEMENTS: diff --git a/activity/activity.info b/activity/activity.info index 427a4a4..ac1f9cc 100755 --- a/activity/activity.info +++ b/activity/activity.info @@ -3,7 +3,7 @@ name = Measure bundle_id = org.laptop.MeasureActivity exec = sugar-activity measure.MeasureActivity icon = activity-measure -activity_version = 44 +activity_version = 45 show_launcher = yes license = GPLv2+ update_url = http://wiki.laptop.org/go/Activities/G1G1 diff --git a/audiograb.py b/audiograb.py index da79f8b..1253d6c 100644 --- a/audiograb.py +++ b/audiograb.py @@ -32,7 +32,7 @@ from numpy.fft import rfft from config import RATE, BIAS, DC_MODE_ENABLE, CAPTURE_GAIN, MIC_BOOST,\ MAX_LOG_ENTRIES, QUIT_MIC_BOOST, QUIT_DC_MODE_ENABLE,\ QUIT_CAPTURE_GAIN, QUIT_BIAS, DISPLAY_DUTY_CYCLE, XO1, \ - XO15, XO175, MAX_GRAPHS + XO15, XO175, XO4, MAX_GRAPHS import logging @@ -77,7 +77,7 @@ class AudioGrab(): elif self.activity.hw == XO15: self._voltage_gain = -0.0001471 self._voltage_bias = 1.695 - elif self.activity.hw == XO175: + elif self.activity.hw in [XO175, XO4]: self._voltage_gain = 0.000051 self._voltage_bias = 1.372 else: # XO 3.0 @@ -318,7 +318,7 @@ class AudioGrab(): return (420000000 / avg_buffer) - 13500 else: return 420000000 - elif self.activity.hw == XO175: + elif self.activity.hw in [XO175, XO4]: return (180000000 / (30700 - avg_buffer)) - 3150 else: # XO 3.0 return (46000000 / (30514 - avg_buffer)) - 1150 @@ -946,6 +946,21 @@ class AudioGrab_XO175(AudioGrab): self._set_sensor_type(mode, bias, gain, boost) +class AudioGrab_XO4(AudioGrab): + ''' Override parameters for OLPC XO 4 laptop ''' + def set_sensor_type(self, sensor_type=SENSOR_AC_BIAS): + '''Helper to modify (some) of the sensor settings.''' + PARAMETERS = { + SENSOR_AC_NO_BIAS: (False, False, 80, True), + SENSOR_AC_BIAS: (False, True, 80, True), + SENSOR_DC_NO_BIAS: (True, False, 80, False), + SENSOR_DC_BIAS: (True, True, 90, False) + } + log.debug('Set Sensor Type to %s' % (str(sensor_type))) + mode, bias, gain, boost = PARAMETERS[sensor_type] + self._set_sensor_type(mode, bias, gain, boost) + + class AudioGrab_Unknown(AudioGrab): ''' Override parameters for generic hardware ''' def set_sensor_type(self, sensor_type=SENSOR_AC_BIAS): @@ -64,6 +64,7 @@ XO1 = 'xo1' XO15 = 'xo1.5' XO175 = 'xo1.75' XO30 = 'xo3.0' +XO4 = 'xo4' UNKNOWN = 'unknown' # Bounds of side slider @@ -21,6 +21,7 @@ pygst.require("0.10") import gtk import pango import os +import subprocess import csv from gettext import gettext as _ @@ -54,12 +55,12 @@ except ImportError: from journal import DataLogger from audiograb import AudioGrab_XO175, AudioGrab_XO15, AudioGrab_XO1, \ - AudioGrab_Unknown + AudioGrab_XO4, AudioGrab_Unknown from drawwaveform import DrawWaveform from toolbar_side import SideToolbar from sensor_toolbar import SensorToolbar from tuning_toolbar import TuningToolbar, InstrumentToolbar -from config import ICONS_DIR, XO1, XO15, XO175, UNKNOWN, INSTRUMENT_DICT +from config import ICONS_DIR, XO1, XO15, XO175, XO4, UNKNOWN, INSTRUMENT_DICT import logging @@ -71,28 +72,26 @@ logging.basicConfig() PREFIX = '♬' -def _get_hardware(): - ''' Determine whether we are using XO 1.0, 1.5, or "unknown" hardware ''' - product = _get_dmi('product_name') - if product is None: - if os.path.exists('/sys/devices/platform/lis3lv02d/position'): - return XO175 - elif os.path.exists('/etc/olpc-release') or \ - os.path.exists('/sys/power/olpc-pm'): - return XO1 - else: - return UNKNOWN - if product != 'XO': - return UNKNOWN +def get_hardware(): + ''' Determine whether we are using XO 1.0, 1.5, ... or 'unknown' + hardware ''' version = _get_dmi('product_version') - if version == '1' or version == '1.0': + # product = _get_dmi('product_name') + if version is None: + hwinfo_path = '/bin/olpc-hwinfo' + if os.path.exists(hwinfo_path) and os.access(hwinfo_path, os.X_OK): + model = check_output([hwinfo_path, 'model'], 'unknown hardware') + version = model.strip() + if version == '1': return XO1 elif version == '1.5': - return XO15 + return XO15 elif version == '1.75': return XO175 + elif version == '4': + return XO4 else: - return UNKNOWN + return UNKNOWN def _get_dmi(node): @@ -105,6 +104,28 @@ def _get_dmi(node): return None +def check_output(command, warning): + ''' Workaround for old systems without subprocess.check_output''' + if hasattr(subprocess, 'check_output'): + try: + output = subprocess.check_output(command) + except subprocess.CalledProcessError: + log.warning(warning) + return None + else: + import commands + + cmd = '' + for c in command: + cmd += c + cmd += ' ' + (status, output) = commands.getstatusoutput(cmd) + if status != 0: + log.warning(warning) + return None + return output + + class MeasureActivity(activity.Activity): ''' Oscilloscope Sugar activity ''' @@ -151,6 +172,8 @@ class MeasureActivity(activity.Activity): self.audiograb = AudioGrab_XO15(self.wave.new_buffer, self) elif self.hw == XO175: self.audiograb = AudioGrab_XO175(self.wave.new_buffer, self) + elif self.hw == XO4: + self.audiograb = AudioGrab_XO4(self.wave.new_buffer, self) elif self.hw == XO1: self.audiograb = AudioGrab_XO1(self.wave.new_buffer, self) else: |