Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter 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)
commite04160e69b4ec6f955802fcf895852c786ba86b6 (patch)
treee4a49dd64274dc2bea4d8bebe2ab0cc9488e3d25
parentd36a2809a6574d62ef4f52e860754e139f3c1c02 (diff)
add xo4 support
-rw-r--r--NEWS21
-rwxr-xr-xactivity/activity.info2
-rw-r--r--audiograb.py21
-rw-r--r--config.py1
-rw-r--r--measure.py59
5 files changed, 82 insertions, 22 deletions
diff --git a/NEWS b/NEWS
index ef372e2..06a4de1 100644
--- a/NEWS
+++ b/NEWS
@@ -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):
diff --git a/config.py b/config.py
index ffb02ca..8a4c22c 100644
--- a/config.py
+++ b/config.py
@@ -64,6 +64,7 @@ XO1 = 'xo1'
XO15 = 'xo1.5'
XO175 = 'xo1.75'
XO30 = 'xo3.0'
+XO4 = 'xo4'
UNKNOWN = 'unknown'
# Bounds of side slider
diff --git a/measure.py b/measure.py
index 8f565fc..68e1095 100644
--- a/measure.py
+++ b/measure.py
@@ -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: